wxpusher-docs
wxpusher-docs copied to clipboard
回调/上行消息能否增加签名?
我们(记为A)接收上行消息时,为了保证安全,有时需要确保该消息是wxpusher(记为B)推送的。 比如“发送指令重启服务”的情况,不仅要保证该用户是已知的管理员用户,还要保证该POST的请求来源是wxpusher,而不是第三方。
建议wxpusher后台回调时增加一个签名(使用消息内容和appToken),这样只要第三方拿不到token,就无法伪造请求来源。 具体的实现方法,个人想法是:
- B回调A时,在POST请求头中增加一个
sign
字段,该字段为整条JSON内容 + "-" + appToken
用某种散列算法(MD5
或者SHA1
或者其他的算法)(记为hash(...)
)进行签名 - A收到请求时,分两种情况:
- 如果该回调地址只有一个app使用,则直接计算
hash(整条JSON内容 + "-" + appToken)
与sign
比较,如果不相同则丢弃消息,相同则继续处理; - 如果有多个app使用同一个回调地址,则先解析消息内容得到
appId
,然后查得相应的appToken
,再进行上面的处理
- 如果该回调地址只有一个app使用,则直接计算
- 如果要防止重放攻击,A要进行额外的判断,如:
- 整条消息是否在之前的x分钟内重复过?(只需判断sign是否重复过)
-
time
字段和本地时间之差,是否在合理区间内?(小于x分钟)
这样既不会破坏旧的协议,也可以增加回调的安全性。希望这个建议能被采纳。