微信公眾號開發中,微信平臺向第三方服務器轉發的消息,在處理之前,是應該進行校驗的。這一點,稍有安全常識的開發者都應該能意識到。然而,微信公眾平臺的接入指南中,只提到了一開始驗證服務器時對 GET 請求的驗證,而對 POST 請求的驗證卻只字不提,導致網上很多微信公眾號開發的入門教程都忽略了這一點。微信平臺向第三方服務器轉發用戶消息,都是以 POST 請求的方式進行的,如果不進行校驗,可能被偽造(其實根本都不需要偽造好么)成微信平臺的消息攻擊。
微信公眾平臺的接入指南提到,GET 請求的校驗,需要 token
、timestamp
、nonce
和 signature
,若
signature == sha1(sort(token, timestamp, nonce)) #這是偽代碼
即為校驗成功。其中 token
是開發者自己配置的,timestamp
、nonce
和 signature
是 URL 中攜帶過來的。校驗算法可以自己實現,也可以用網上現成的代碼,如 wechat_sdk 的 check_signature() 函數。Django 開發中,從 GET 請求的 URL 中獲取后三個參數,可以用如下方法(以 signature
為例):
signature = request.GET.get('signature', None)
很多教程講到這里就結束了,并不提 POST 請求如何驗證,或者用了很繁瑣的方法(如 WSGI)去提取 URL 中的參數。其實大可不必,POST 請求跟 GET 請求的驗證方法完全一樣,提取參數也是使用同樣的語句:
signature = request.GET.get('signature', None)
注意了,雖然這是一條 POST 報文,但要從 URL 中提取 query string,還是得用 GET。就是這樣。但是千萬記得,一定要進行驗證。