微信小程序-API接口安全详解


Posted in Javascript onJuly 16, 2019

一.接口安全的必要性

最近我们公司的小程序要上线了,但是小程序端是外包负责的,我们负责提供后端接口。这就可能会造成接口安全问题。一些别有用心的人可以通过抓包或者其他方式即可获得到后台接口信息,如果不做权限校验,他们就可以随意调用后台接口,进行数据的篡改和服务器的攻击,会对一个企业造成很严重的影响。

因此,为了防止恶意调用,后台接口的防护和权限校验非常重要。

虽然小程序有HTTPs和微信保驾护航,但是还是要加强安全意识,对后端接口进行安全防护和权限校验。

二.小程序接口防护

小程序的登录过程:

微信小程序-API接口安全详解

  1. 小程序端通过wx.login()获取到code后发送给后台服务器
  2. 后台服务器使用小程序的appid、appsecret和code,调用微信接口服务换取session_key和openid(openid可以理解为是每个用户在该小程序的唯一识别号)
  3. 后台服务器自定义生成一个3rd_session,用作openid和session_key的key值,后者作为value值,保存一份在后台服务器或者redis或者mysql,同时向小程序端传递3rd_session
  4. 小程序端收到3rd_session后将其保存到本地缓存,如wx.setStorageSync(KEY,DATA)
  5. 后续小程序端发送请求至后台服务器时均携带3rd_session,可将其放在header头部或者body里
  6. 后台服务器以3rd_session为key,在保证3rd_session未过期的情况下读取出value值(即openid和session_key的组合值),通过openid判断是哪个用户发送的请求,再和发送过来的body值做对比(如有),无误后调用后台逻辑处理
  7. 返回业务数据至小程序端

会话密钥session_key 是对用户数据进行加密签名的密钥。为了应用自身的数据安全,开发者服务器不应该把会话密钥下发到小程序,也不应该对外提供这个密钥。

session_key主要用于wx.getUserInfo接口数据的加解密,如下图所示:

微信小程序-API接口安全详解

sessionId

在微信小程序开发中,由wx.request()发起的每次请求对于服务端来说都是不同的一次会话。啥意思呢?就是说区别于浏览器,小程序每一次请求都相当于用不同的浏览器发的。即不同的请求之间的sessionId不一样(实际上小程序cookie没有携带sessionId)。

如下图所示:

微信小程序-API接口安全详解

实际上小程序的每次wx.request()请求中没有包含cookie信息,即没有sessionId信息。

但是我们可以在每次wx.request()中的header里增加。

接口防护方法

  • 使用HTTPS防止抓包,使用https至少会给破解者在抓包的时候提高一些难度
  • 接口参数的加密,通过md5加密数据+时间戳+随机字符串(salt),然后将MD5加密的数据和时间戳、原数据均传到后台,后台规定一个有效时长,如果在该时长内,且解密后的数据与原数据一致,则认为是正常请求;也可以采用aes/des之类的加密算法,还可以加入客户端的本地信息作为判断依据
  • 本地加密混淆,以上提到的加解密数据和算法,不要直接放在本地代码,因为很容易被反编译和破解,建议放到独立模块中去,并且函数名称越混淆越难读越安全。
  • User-Agent 和 Referer 限制
  • api防护的登录验证,包括设备验证和用户验证,可以通过检查session等方式来判断用户是否登录
  • api的访问次数限制,限制其每分钟的api调用次数,可以通过session或者ip来做限制
  • 定期监测,检查日志,侦查异常的接口访问

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
短信提示使用 特效
Jan 19 Javascript
javascript event 事件解析
Jan 31 Javascript
js函数的引用, 关于内存的开销
Sep 17 Javascript
JQuery的$命名冲突详细解析
Dec 28 Javascript
jQuery照片伸缩效果不影响其他元素的布局
May 09 Javascript
Python脚本后台运行的几种方式
Mar 09 Javascript
jQuery下拉美化搜索表单效果代码分享
Aug 25 Javascript
跟我学习javascript的定时器
Nov 19 Javascript
微信公众平台开发教程(四) 实例入门:机器人回复(附源码)
Dec 02 Javascript
Underscore之Array_动力节点Java学院整理
Jul 10 Javascript
vue解决一个方法同时发送多个请求的问题
Sep 25 Javascript
k8s node节点重新加入master集群的实现
Feb 22 Javascript
jquery实现垂直无限轮播的方法分析
Jul 16 #jQuery
JavaScript解析JSON数据示例
Jul 16 #Javascript
微信小程序 Storage更新详解
Jul 16 #Javascript
微信小程序实现张图片合成为一张并下载
Jul 16 #Javascript
JQuery实现简单的复选框树形结构图示例【附源码下载】
Jul 16 #jQuery
JS实现的排列组合算法示例
Jul 16 #Javascript
使用Phantomjs和Node完成网页的截屏快照的方法
Jul 16 #Javascript
You might like
自制短波长线天线频率预选器 - 成功消除B2K之流的镜像
2021/03/02 无线电
几个有用的php字符串过滤,转换函数代码
2012/05/01 PHP
php模板原理讲解
2013/11/13 PHP
重新认识php array_merge函数
2014/08/31 PHP
cakephp打印sql语句的方法
2015/02/13 PHP
教你识别简单的免查杀PHP后门
2015/09/13 PHP
ThinkPHP3.1.2 使用cli命令行模式运行的方法
2020/04/14 PHP
PHP实现简易用户登录系统
2020/07/10 PHP
判断是否输入完毕再激活提交按钮
2006/06/26 Javascript
DEFER怎么用?
2006/07/01 Javascript
一段多浏览器的"复制到剪贴板"javascript代码
2007/03/27 Javascript
40个有创意的jQuery图片、内容滑动及弹出插件收藏集之一
2011/12/31 Javascript
JavaScript中使用Substring删除字符串最后一个字符
2013/11/03 Javascript
jquery显示隐藏元素的实现代码
2016/05/19 Javascript
bootstrap自定义样式之bootstrap实现侧边导航栏功能
2018/09/10 Javascript
vue实现添加与删除图书功能
2018/10/07 Javascript
使用webpack构建应用的方法步骤
2019/03/04 Javascript
详解如何实现Element树形控件Tree在懒加载模式下的动态更新
2019/04/25 Javascript
微信小程序使用npm包的方法步骤
2019/08/13 Javascript
a标签调用js的方法总结
2019/09/05 Javascript
Layui数据表格之单元格编辑方式
2019/10/26 Javascript
JS实现基本的网页计算器功能示例
2020/01/16 Javascript
解决vue项目中某一页面不想引用公共组件app.vue的问题
2020/08/14 Javascript
JavaScript枚举选择jquery插件代码实例
2020/11/17 jQuery
Python标准库之collections包的使用教程
2017/04/27 Python
如何在VSCode上轻松舒适的配置Python的方法步骤
2019/10/28 Python
pytorch 实现在预训练模型的 input上增减通道
2020/01/06 Python
python绘制动态曲线教程
2020/02/24 Python
Python中常用的os操作汇总
2020/11/05 Python
CSS3中:nth-child和:nth-of-type的区别深入理解
2014/03/10 HTML / CSS
HTML5对比HTML4的主要改变和改进总结
2016/05/27 HTML / CSS
英国大码女性时装零售商:Evans
2018/08/29 全球购物
德尔福集团DELPHI的笔试题
2012/02/22 面试题
专题民主生活会对照检查材料思想汇报
2014/09/29 职场文书
2015年普法依法治理工作总结
2015/05/26 职场文书
如何利用 CSS Overview 面板重构优化你的网站
2021/10/24 HTML / CSS