微信小程序-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 相关文章推荐
Opacity.js
Jan 22 Javascript
javascript 通用简单的table选项卡实现
May 07 Javascript
js获取URL的参数的方法(getQueryString)示例
Sep 29 Javascript
利用jQuery设计一个简单的web音乐播放器的实例分享
Mar 08 Javascript
清除js缓存的多种方法总结
Dec 09 Javascript
浅谈JavaScript中的apply/call/bind和this的使用
Feb 26 Javascript
Vue项目中使用Vux的安装过程
May 01 Javascript
JS使用对象的defineProperty进行变量监控操作示例
Feb 02 Javascript
Android 自定义view仿微信相机单击拍照长按录视频按钮
Jul 19 Javascript
原生javascript实现类似vue的数据绑定功能示例【观察者模式】
Feb 24 Javascript
vue中全局路由守卫中替代this操作(this.$store/this.$vux)
Jul 24 Javascript
解决element-ui的下拉框有值却无法选中的情况
Nov 07 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
十天学会php之第六天
2006/10/09 PHP
PHP+Mysql+jQuery实现动态展示信息
2011/10/08 PHP
linux命令之调试工具strace的深入分析
2013/06/03 PHP
php生成短网址示例
2014/05/05 PHP
PHP5.6新增加的可变函数参数用法分析
2017/08/25 PHP
PHP实现数组转JSon和JSon转数组的方法示例
2018/06/14 PHP
List Installed Software Features
2007/06/11 Javascript
extjs 学习笔记(一) 一些基础知识
2009/10/13 Javascript
Extjs学习笔记之四 工具栏和菜单
2010/01/07 Javascript
28个JS验证函数收集
2010/03/02 Javascript
JQuery中判断一个元素下面是否有内容或者有某个标签的判断代码
2012/02/02 Javascript
深入document.write()与HTML4.01的非成对标签的详解
2013/05/08 Javascript
node.js中的events.emitter.removeAllListeners方法使用说明
2014/12/10 Javascript
javascript获取当前鼠标坐标的方法
2015/01/10 Javascript
jQuery网页选项卡插件rTabs用法实例分析
2015/08/26 Javascript
javascript实现标签切换代码示例
2016/05/22 Javascript
jquery实现(textarea)placeholder自动换行
2016/12/22 Javascript
JS实现类似百叶窗下拉菜单效果
2016/12/30 Javascript
微信小程序实现验证码获取倒计时效果
2018/02/08 Javascript
React性能优化系列之减少props改变的实现方法
2019/01/17 Javascript
Vue实现boradcast和dispatch的示例
2020/11/13 Javascript
小程序自定义圆形进度条
2020/11/17 Javascript
[02:37]2018DOTA2亚洲邀请赛赛前采访-EG篇
2018/04/03 DOTA
python 快速排序代码
2009/11/23 Python
python通过pip更新所有已安装的包实现方法
2017/05/19 Python
Python实现朴素贝叶斯分类器的方法详解
2018/07/04 Python
利用Python对文件夹下图片数据进行批量改名的代码实例
2019/02/21 Python
Python IDE Pycharm中的快捷键列表用法
2019/08/08 Python
自定义Django Form中choicefield下拉菜单选取数据库内容实例
2020/03/13 Python
浅谈selenium如何应对网页内容需要鼠标滚动加载的问题
2020/03/14 Python
Python实现LR1文法的完整实例代码
2020/10/25 Python
美国智能家居专家:tink
2019/06/04 全球购物
民事授权委托书范文
2014/08/02 职场文书
社区党风廉政建设调研报告
2015/01/01 职场文书
党小组考察意见
2015/06/02 职场文书
Go Grpc Gateway兼容HTTP协议文档自动生成网关
2022/06/16 Golang