验证消息真假

由于HTTP服务在网路世界是公开的,因此第三方可以按照微信消息格式,向Foxtable端的HTTP服务提交虚假的微信消息。

所以对于非常注重安全的系统,有必要验证消息是否来自微信服务器。

方法和接入验证是一样的,不管是get方式还是post方式,微信服务器都都会包括signature、timestamp、nonce和echostr等4个用于真实性验证的参数。

微信服务器在进行接入验证的时候,是用get方式访问Foxtable端的HTTP服务,提交消息的时候,用的则是Post方式。

我们之前只对接入提供了验证,如果要加上消息的真伪验证,只需将代码改为:

Select Case e.path
    Case "wefox"
       
If Functions.Execute("VerifySignature",e) = False Then
'如果验证失败,直接返回
            Return
        End
If
        If e.Request.HttpMethod = "GET"
           
e.WriteString(e.GetValues("echostr"))
        ElseIf e.Request.HttpMethod = "Post"
            Dim xo As Foxtable.XObject = Foxtable.XObject.Parse(e.PlainText)
            Dim st As New
Date(1970,1,1,8,0,0)
            Select Case xo("MsgType")
                Case "text","image","voice","video",
"shortvideo"
'为了简单,这里只保存文本、图片、语音和视频消息。
                    Dim dr As DataRow = DataTables("Message").AddNew()
                    dr("FromUserName") = xo("FromUserName")
                    dr("CreateTime") = st.AddSeconds(xo("CreateTime"))
                    dr("MsgType") = xo("MsgType")
                    dr("MsgId") = xo("MsgId")
                    dr("MediaId") = xo("MediaId")
                    dr("ThumbMediaId") = xo("ThumbMediaId")
                    dr("PicUrl") = xo("PicUrl")
                    dr("Content") = xo("Content")
                    dr("Format") = xo("Format")
                    dr("Recognition") = xo("Recognition")
                    dr.Save()
            End Select
        End
If

End
Select

需要注意的是,本节接下来的例子,都只会对接入进行验证,而不会验证消息真伪。

此外如果开启了安全模式,消息的收发都将采用密文形式,此时就没必要验证消息的真实性了,因为伪造的消息肯定无法正常解密。


本页地址:http://www.foxtable.com/mobilehelp/topics/0209.htm