微信公眾平台開發安全策略

高洛峰
發布: 2017-03-03 10:11:58
原創
1937 人瀏覽過

儘管處理微信請求的伺服器,處於微信伺服器的後端,但是安全性問題依然不可小覷。

大概總結以下幾個方面,希望引起注意。

一、設定高複雜度的Token,盡量隱藏服務位址URL 

URL:即為處理微信請求的連結位址
Token:使用者身分憑證 

#申請成為開發者或修改URL\Token時,微信會透過Get請求存取URL,驗證簽名,其中需要Token。 

過程相當於一次握手,如果握手成功,可進行後續的通訊。

微信公众平台开发安全策略

 

面臨的危險: 

1、如URL和Token被破解,直接連結到其他公用帳號,直接可以盜用服務。當然對於某些廣告類型帳號而言,這樣無利可圖。但是,如果是提供某種應用或服務的公眾帳號,免費給其他帳號提供服務,勢必增加服務端壓力,帶來一定的風險。

2、如果URL被破解,即使token沒被破解。一些不法份子,可能對該URL進行攻擊,當然槍打出頭鳥,想被駭客盯上也不沒那麼容易。呵呵 

建議:

1、盡量保證服務的URL,與提供訊息或網頁沒有直接關係。以防止,根據URL推算得出服務URL。

2、可以使用URL重定向,將一些路徑資訊進行隱藏。

3、在服務中判定請求的來源,是否是微信伺服器來的請求。這個可以根據請求的URL來進行判定,對於其他請求不予處理。

4、Token值,盡量複雜一些。 

二、建議每次請求,都進行簽章驗證

在設定URL或token後,微信都會提交get請求,來存取我們後端服務。驗證通過之後,微信其他請求都是透過POST方式提交。

所以在程式碼中,我們常常會根據請求的方式來判斷是否進行簽章驗證。在先前的例子中,也曾這麼用: 

 /// <summary>
        /// 处理请求,产生响应
        /// </summary>
        /// <returns></returns>
        public string Response()
        {
            string method = Request.HttpMethod.ToUpper();
            //验证签名
            if (method == "GET")
            {
                if (CheckSignature())
                {
                    return Request.QueryString[ECHOSTR];
                }
                else
                {
                    return "error";
                }
            }

            //处理消息
            if (method == "POST")
            {
                return ResponseMsg();
            }

            return "无法处理";
        }
登入後複製

#儘管微信其他請求是以POST提交的,但是其URL中同樣攜帶了簽名訊息,我們同樣需要進行簽名認證。所以為了安全起見,建議每次請求都進行簽名認證。

根據這個原理,我們將程式碼修改如下: 

        /// <summary>
        /// 处理请求,产生响应        /// </summary>
        /// <returns></returns>
        public string Response()
        {            string method = Request.HttpMethod.ToUpper();            //验证签名
            if (method == "GET")
            {                if (CheckSignature())
                {                    return Request.QueryString[ECHOSTR];
                }                else
                {                    return "error";
                }
            }            //处理消息
            if (method == "POST")
            {                //验证签名
                if (CheckSignature())
                {                    return ResponseMsg();
                }
            }            return "无法处理";
        }
登入後複製

 

簽章演算法CheckSignature(),這裡不再贅述,具體可見:微信公眾帳號開發基礎架構搭建 

三、可以根據ToUserName 驗證請求

通常我們的公用帳號都對應一個openId,在處理訊息時可以取得。這個openId是固定的,可以根據其判定發送者的身分資訊。這種方式,可以很好的過濾無效訊息或欺騙,只有發給我的訊息,我才處理。即使URL和Token被人破解,也同樣能夠保證後端服務,只為我們的公用帳號提供服務。

/// <summary>
        /// 是否是发给我的呢
        /// </summary>
        /// <param name="toUserName">接受者</param>
        /// <returns>bool</returns>
        private bool IsSentToMe(string toUserName)
        {
            return string.Equals(toUserName,Context.OpenID,StringComparison.OrdinalIgnoreCase);
        }
登入後複製

 

四、AppId和AppSecret

如果是服務號,還有一些高級功能,而這些高級功能需要開發者憑證:AppId和AppSecret。

根據AppId和AppSecret可以獲得ACCESS_TOKEN,根據ACCESS_TOKEN可以管理高階功能了,例如:自訂選單。
ACESS_TOKEN有過期時間,通常為7200S。但是AppId和AppSecret是系統隨機產生的,無過期時間,如果需要修改,需要登入微信公眾帳號管理平台進行重設。

取得Access_Token方式,透過Get請求如下URL

https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=xxxx&secret=xxxx.
登入後複製

 取得Access_Token後,就可以操作一些高階介面

例如:

建立自訂選單,是透過http請求方式:POST(請使用https協定)

#
https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN
登入後複製

## 具體實現,請參閱:微信公眾帳號開發自訂選單

ACCESS_TOKEN是透過get方法獲得的,其實不太安全,如果被人竊取,其可以修改自訂選單的鏈接,可以將其改為一些廣告鏈接,或者更邪惡的鏈接,你這服務器直接成了人家的肉機。所以一定要確保伺服器的安全。為了安全起見,建議隔一段時間重置AppId和AppSecret(微信公眾平台的後台服務頁面)。重要的還是要確保允許伺服器的安全,具體可以見五。

五、確保伺服器的安全

伺服器安全要素很多,例如:確保網路安全、設定防火牆、安裝防毒軟體、限制一些連接埠等等,這跟我們平時伺服器安全要求一樣,這方面資料很多,這裡不再贅述。 

 更多微信大眾平台開發安全策略 相關文章請追蹤PHP中文網!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!