微信小程序-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 相关文章推荐
javascript 特殊字符串
Feb 25 Javascript
改写一个简单的菜单 弹性大小
Dec 02 Javascript
javascript中获取下个月一号,是星期几
Jun 01 Javascript
Jquery实现点击切换图片并隐藏显示内容(2种方法实现)
Apr 11 Javascript
javascript创建动态表单的方法
Jul 25 Javascript
JS实现的论坛Ajax打分效果完整实例
Oct 31 Javascript
Easyui 去除jquery-easui tab页div自带滚动条的方法
May 10 jQuery
vue v-for 使用问题整理小结
Aug 04 Javascript
Vue利用localStorage本地缓存使页面刷新验证码不清零功能的实现
Sep 04 Javascript
如何通过JS实现日历简单算法
Oct 14 Javascript
Vue页面渲染中key的应用实例教程
Jan 12 Vue.js
vue项目支付功能代码详解
Feb 18 Vue.js
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
Memcache 在PHP中的使用技巧
2010/02/08 PHP
php 实现进制转换(二进制、八进制、十六进制)互相转换实现代码
2010/10/22 PHP
PHP header()函数使用详细(301、404等错误设置)
2013/04/17 PHP
php结合安卓客户端实现查询交互实例
2015/05/05 PHP
Zend Framework教程之MVC框架的Controller用法分析
2016/03/07 PHP
PHP基于PDO实现的SQLite操作类【包含增删改查及事务等操作】
2017/06/21 PHP
php获得刚插入数据的id 的几种方法总结
2018/05/31 PHP
Javascript的一种模块模式
2008/03/22 Javascript
js保存当前路径(cookies记录)
2010/12/14 Javascript
jQuery实现鼠标悬停背景翻转的黑色导航菜单代码
2015/09/14 Javascript
JQuery中Ajax()的data参数类型实例分析
2015/12/15 Javascript
Vue.js组件使用开发实例教程
2016/11/01 Javascript
Bootstrap 模态框(Modal)插件代码解析
2016/12/21 Javascript
微信小程序canvas拖拽、截图组件功能
2018/09/04 Javascript
详解在create-react-app使用less与antd按需加载
2018/12/06 Javascript
详解Jest结合Vue-test-utils使用的初步实践
2019/06/27 Javascript
js实现金山打字通小游戏
2020/07/24 Javascript
[14:57]DOTA2 HEROS教学视频教你分分钟做大人-幽鬼
2014/06/13 DOTA
[01:01:52]DOTA2-DPC中国联赛定级赛 SAG vs iG BO3第二场 1月9日
2021/03/11 DOTA
python timestamp和datetime之间转换详解
2017/12/11 Python
python实现自动发送邮件发送多人、群发、多附件的示例
2018/01/23 Python
Python cookbook(数据结构与算法)通过公共键对字典列表排序算法示例
2018/03/15 Python
Django学习笔记之ORM基础教程
2018/03/27 Python
Pytorch之view及view_as使用详解
2019/12/31 Python
Python网页解析器使用实例详解
2020/05/30 Python
python palywright库基本使用
2021/01/21 Python
使用css3背景渐变中的透明度来设置不同颜色的背景渐变
2014/03/31 HTML / CSS
全球最大的房车租赁市场:Outdoorsy
2018/09/19 全球购物
印尼在线购买隐形眼镜网站:Lensza.co.id
2019/04/27 全球购物
一些关于MySql加速和优化的面试题
2014/01/30 面试题
高中的职业生涯规划书
2013/12/28 职场文书
出纳试用期自我鉴定
2014/04/07 职场文书
我的职业生涯规划:打造自己的运动帝国
2014/09/18 职场文书
期中考试后的感想
2015/08/07 职场文书
7个你应该知道的JS原生错误类型
2021/04/29 Javascript
JavaScript实现音乐播放器
2022/08/14 Javascript