微信公众平台开发教程(七)安全策略

摘要:
微信公众平台开发教程(七)安全策略尽管处理微信请求的服务器,处于微信服务器的后端,但是安全问题依然不可小觑。但是AppId和AppSecret是系统随机生成的,无过期时间,如果需要修改,需要登录微信公众账号管理平台进行重置。为了安全起见,建议隔一段时间重置AppId和AppSecret。
微信公众平台开发教程(七)安全策略

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

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

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

URL:即为处理微信请求的链接地址
Token:用户身份凭证

申请成为开发者或者修改URLToken时,微信会通过Get请求访问URL,验证签名,其中需要Token。

过程相当于一次握手,如果握手成功,可进行后续的通信。

填写信息

成为开发者后,我们也可以进行修改

微信公众平台开发教程(七)安全策略第2张

面临的危险:

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。

根据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(微信公众平台的后台服务页面)。重要的还是要保证允许服务器的安全,具体可以见五。

五、保证服务器的安全

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

免责声明:文章转载自《微信公众平台开发教程(七)安全策略》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇[转]重建损坏的Windows Management Instrumentation(WMI)服务Linux 的软件管理及配置下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

webstorm中配置过visualsvn,后面做更改要更换authentication realm的解决办法

找这个找了好久,一直改不过来,终于找到了解决办法 首先,在提交代码时提示: 但是我的authentication realm已经时这个了,并且账号和密码也改了,所以要更改authentication realm。 使用的时候要安装TortoiseSVN,安装好之后数遍右键会提示相关的操作;在空白处右键,选择TortoiseSVN-重新定位,会弹出下面这个...

axios发请求的基本语法:

axios发请求的基本语法: axios({ url:'路径',//这个路径中可以包含params或query参数 method:'get/post/put/delete', params:{},//包含query参数的对象,问号后面的参数 data:{},//包含请求体参数的对象 }) axios.get(url,{配置})//{params:{id:1...

微信公众平台的开发过程及其要点

微信公众平台的搭建,首先需要确定整体的架构模式,我们一般选用B/S的整体架构模式,手机或者pc端可以通过关注微信公众 号,进而访问和操作公众号中的内容,其中的主要搭建包括: A.使用xampp继承开发环境来搭建后台,需要用到的服务器和数据库。(apache+mysql) B.前端页面通过html+php动态网页来实现。如果再加点js+css效果就显示的更加...

【Python】爬取百度图片

所需要导入的包:BeautifulSoup:该模块用于接收一个HTML或XML字符串,然后将其进行格式化,之后遍可以使用他提供的方法进行快速查找指定元素,从而使得在HTML或XML中查找指定元素变得简单。这里是用来获取一个页面里面的各个标签及里面的内容,我们主要用到它里面的find(),find_All()函数requests:是用来获取网页信息的,也就是...

sql 简单查询修改

1.group by order by select siteid count(*)as 1 from webdb where gathtrime between '2017-06-14 00:00:00' and '2017-06-14 23:59:59'group by siteid order by 1desc 2 inlimit sel...

html5 播放 rtsp

目前大多数网络摄像头都是通过 RTSP 协议传输视频流的,但是 html 并不标准支持 RTSP 流。除了 Firefox 浏览器可以直接播放 RTSP 流之外,几乎没有其他浏览器可以直接播放 RTSP 流。Electron 应用是基于 Chromium 内核的,因此也不能直接播放 RTSP 流。 在借助一定工具的情况下,可以实现在 Web 页面上播放 R...