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

互联网 17-3-3

尽管处理微信请求的服务器,处于微信服务器的后端,但是安全问题依然不可小觑。

大概总结以下几个方面,希望引起注意。

一、设置高复杂度的Token,尽量隐藏服务地址URL

申请成为开发者或者修改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。

获取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

具体实现,见:微信公众账号开发自定义菜单

五、保证服务器的安全

服务器安全要素很多,比如:保证网络安全、设置防火墙、安装杀毒软件、限制一些端口等等,这跟我们平时服务器安全要求一样,这方面资料很多,这里不再赘述。

更多微信公众平台开发安全策略 相关文章请关注PHP中文网!

来源链接:
免责声明:
1.资讯内容不构成投资建议,投资者应独立决策并自行承担风险
2.本文版权归属原作所有,仅代表作者本人观点,不代表本站的观点或立场
上一篇:php获取远程图片并下载保存到本地的方法分析 下一篇:微信公众平台开发获取个性二维码

相关资讯