1

小程序API接口攻击防护

 1 year ago
source link: https://www.daguanren.cc/post/api_encrypt.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client
06月04, 2018

小程序API接口攻击防护

为什么要做接口防护和权限校验?

有时候,黑客通过抓包或者其他方式即可获得到后台接口信息,如果不做权限校验,黑客就可以随意调用后台接口,进行数据的篡改和服务器的攻击。因此,为了防止恶意调用,后台接口的防护和权限校验非常重要。

小程序如何进行接口防护?

要进行小程序的接口防护,首先需要了解小程序的登录过程,如下图所示(参考:https://developers.weixin.qq.com/miniprogram/dev/api/open-api/login/wx.login.html

alt

整个的流程如下:

  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. 返回业务数据至小程序端

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

session_key主要用于wx.getUserInfo接口数据的加解密,如下图所示(参考:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/signature.html#%E6%96%B9%E5%BC%8F%E4%B8%80%EF%BC%9A%E5%BC%80%E5%8F%91%E8%80%85%E5%90%8E%E5%8F%B0%E6%A0%A1%E9%AA%8C%E4%B8%8E%E8%A7%A3%E5%AF%86%E5%BC%80%E6%94%BE%E6%95%B0%E6%8D%AE

什么是sessionId?

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

如下图所示:

alt

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

那么我们能否实现类似浏览器访问,可以将session保存到后台服务器呢?

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

## java的写法,Jsessionid只是tomcat的对sessionId的叫法,其实就是sessionId header:{'Cookie': 'JSESSIONID=' + sessionId}
## thinkjs3.0 的写法 header:{'Cookie': 'thinkjs=' + sessionId}

效果如下图所示:

alt

在thinkjs3.0的后台代码中,sessionId被保存到了cookie里,可以通过

const session_id = this.cookie('thinkjs')

提取到sessionId的值

具体ThinkJS的实现代码

首先创建sever端的代码,如下图所示(如何安装ThinkJS参考:https://www.daguanren.cc/post/thinkjs_installation.html)

cd到根目录,运行:

thinkjs new server

创建后台代码

alt

完整示例代码请浏览: https://github.com/haodalong/daguanren-wxapp-demo (记得给小星星哦)

更多防护手段请参考API接口如何防止被恶意调用?

本文链接:https://www.daguanren.cc/post/api_encrypt.html

-- EOF --

作者 daguanren

发表于 2018-06-04 19:50:02

,添加在分类 技术分享

,并被添加「 小程序 用户信息 小程序登录过程 」标签

,最后修改于 2020-04-09 20:49:36

版权归本网站的作者所有,转载请注明出处,谢谢大家。 问题咨询和商务合作请发送邮件至[email protected]


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK