引言
小程序会在首次打开时会从微信 CDN 下载小程序的代码包到本地, 那么代码包下载到手机里, 就容易出现加密后的代码包被反编译而使得小程序源码泄露问题.
为什么微信不采取措施避免这个问题?
如果代码不下载到本地, 那就不会出现这样的问题, 可是每次访问从网络加载小程序, 那小程序的体验将会极差. 那就违背了小程序的初衷了, 肯定是不能这样做的.
只能把代码下载到本地的话, 其实这个问题无法避免, 微信官方也努力过, 提供了"上传时自动压缩混淆", "上传时进行代码保护"等策略, 然而并没法真正避免加密后的代码包被反编译得到源码的问题. 混淆也是有规则可言的, 而且进行混淆后的代码小程序还得解析, 这也是会对性能造成损耗, 过度混淆加密是不可行的.
对我们小程序开发者有什么影响?
其实小程序就是个前端, 我们可以当做html来看待, 被看到了源码其实不这么重要, 最重要的是劳动成果被盗取了心情糟糕.
还有一个我们需要防范的, 也就是本文的重点: 接口暴露, 服务端容易被伪造的请求恶意访问.
如果这个不关心的话, 接口可能被非法调用, 直接那我们做好的应用发布, 山寨一个一模一样的小程序. (虽然可以举报但效果不明显, 严重损害开发者利益)
所以我们需要做一些防范措施.
客户端由于源码都能被拿到了, 所以在客户端做什么构造请求头, 加密等等, 无论做什么都是无力的.
接口是不可能不被访问的, 那么我们可以再服务端, 做请求来源的校验. 如果不是我们的小程序, 就可以拒绝访问, 当然也可以给它发送一些无意义数据, 如果你想的话.
怎么区分?
网络请求的 referer
header中不可设置。其格式固定为 https://servicewechat.com/{appid}/{version}/page-frame.html
,其中 {appid}
为小程序的appid, {version}
为小程序的版本号,版本号为 0
表示为开发版、体验版以及审核版本,版本号为 devtools
表示为开发者工具,其余为正式版本;
这是小程序官方文档描述. 详见:https://developers.weixin.qq.com/miniprogram/dev/framework/ability/network.html
我们通过上述描述可以看到, 使用小程序发请求时header是固定不变且无法修改的, 其中还携带了appid, 我们可以通过该值进行判断这个请求是否来自我们的客户端.
………………………………