尽管处理微信请求的服务器,处于微信服务器的后端,但是安全问题依然不可小觑。
大概总结以下几个方面,希望引起注意。
一、设置高复杂度的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方式提交。
所以在代码中,我们常常会根据请求的方式来判断是否进行签名验证。在之前的例子中,也曾这么用:
/// 631fb227578dfffda61e1fa4d04b7d25 /// 处理请求,产生响应 /// 039f3e95db2a684c7b74365531eb6044 /// 2363942ed0d6cd3e85bae1dffa568116f7735d9f6a7af371769ab5c16d23b2f3 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被人破解,也同样能够保证后端服务,只为我们的公众账号提供服务。
/// 631fb227578dfffda61e1fa4d04b7d25 /// 是否是发给我的呢 /// 039f3e95db2a684c7b74365531eb6044 /// ec639f3ec6e6df576b367639452f23c7接受者8bb7487ae6a16a43571bc14c7fcf93c2 /// 2363942ed0d6cd3e85bae1dffa568116boolf7735d9f6a7af371769ab5c16d23b2f3 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中文网!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

Dreamweaver CS6
视觉化网页开发工具

ZendStudio 13.5.1 Mac
功能强大的PHP集成开发环境

SublimeText3汉化版
中文版,非常好用

适用于 Eclipse 的 SAP NetWeaver 服务器适配器
将Eclipse与SAP NetWeaver应用服务器集成。