一.接口安全的需要
最近我们公司的小程序要上线了,但是小程序外包了,我们负责提供后端接口。这可能会导致接口安全问题。一些别有用心的人可以通过抓取包或其他方式获取后台界面信息。如果不检查自己的权限,可以随意调用后台接口篡改数据,攻击服务器,对一个企业会造成严重的影响。
因此,为了防止恶意调用,保护后台接口和验证权限非常重要。
小程序虽然有HTTPs和微信护航,但需要加强安全意识,对后端接口进行安全防护和权限验证。
二.小程序接口保护
小程序的登录过程:
小程序通过wx.login()获取代码,并将其发送到后台服务器。后台服务器使用小程序的appid、appsecret和代码调用微信界面服务,以换取session_key和openid(openid可以理解为小程序中每个用户的唯一标识号)。后台服务器通过自定义生成第三个会话。用作openid和session_key的键值,后者作为值值保存在后台服务器、redis或mysql中,同时将3rd_session传递给小程序,小程序收到3rd_session后保存到本地缓存中,如wx.setStorageSync(KEY,DATA)后续小程序向后台服务器发送请求时,携带3rd_session,可以放在头或者正文中。后台服务器以3rd_session为密钥,在3rd_session未过期的情况下读取该值(即openid和session_key的组合值)。确定哪个用户通过openid发送了请求,然后将其与发送的正文值(如果有)进行比较。如果正确,调用后台逻辑处理,将业务数据返回给小程序。session_key是对用户数据进行加密和签名的密钥。为了应用程序本身的数据安全,开发者服务器不应该向小程序发布会话密钥,也不应该向外部提供这个密钥。
Session_key主要用于wx.getUserInfo界面的数据加密和解密,如下图所示:
便会失效
在微信小程序的开发中,wx.request()发起的每一个请求对于服务器来说都是不同的会话。你什么意思?也就是说,与浏览器不同,小程序的每一个请求都相当于被不同的浏览器发送。也就是说,不同的请求有不同的sessionid(实际上,applet cookie不携带session id)。
如下图所示:
实际上,applet的每个wx.request()请求都不包含cookie信息,也就是说没有sessionId信息。
但是我们每次都可以在wx.request()的头部添加。
界面保护方法
使用HTTPS来防止抓取数据包,这将至少提高黑客抓取数据包时接口参数的加密。通过md5对数据时间戳随机字符串(salt)进行加密,然后将MD5加密后的数据、时间戳和原始数据传输到后台,后台指定一个有效时间。如果解密数据在此时间内与原始数据一致,则视为正常请求;也可以采用aes/des等加密算法,还可以加入客户端的本地信息作为本地加密混淆的判断依据。上面提到的加解密数据和算法不应该直接放在本地代码中,因为容易被反编译和破解,所以建议放在独立的模块中,函数名越混乱越难读,越安全。用户代理和引用者限制api保护的登录验证,包括设备验证和用户验证。您可以通过检查会话等来判断用户是否登录了api。并限制每分钟api调用的次数。您可以通过会话或ip限制常规监控,检查日志,并检测异常接口访问。以上就是本文的全部内容。希望对大家的学习有帮助,支持我们。