混合App的JS接口安全设计
原生框架+网页的混合App的开发速度确实很快,很多公司的项目为了追求开发效率都会选择这种开发方式,我公司的App也是这样子的架构。
这种开发方式,原生接口一旦被滥用,很容易带来安全隐患。
事故
最近公司在App上推广一个投票活动进行拉新,结果发生了意外:有人写了一个网页,在App里面访问,通过JS接口恶意进行刷票。
解决方案
对于JS接口,其实微信的 JSSDK 在安全设计方面已经铺好路,下面总结一下解决方案。
绑定域名
限制能调用JS接口的域名,而且为每个域名分配独立的id和secret,示例:
域名 | domain_id | secret |
---|---|---|
app.domain.com | 100001 | 0a302f7e-4c4c-420c-87d9-b7955efd8fe9 |
page.domain.com | 100002 | 0affa486-8a7a-4965-8668-066ee9e40744 |
页面调用
页面的JS在加载的时候,需要调用App的配置接口,传入相关信息以及secret加密后的signature,去后端验证,并获取Token。
签名规则:
signature=MD5(domain + domainId + timestamp + nonceStr + secret)
示例:
App.config({
domainId: '100001',
timestamp: 1580008634264
nonceStr: 'xxx',
signature
})
App.error(function(res){
// config信息验证失败会执行error函数,如签名过期导致验证失败
});
App.ready(function(){
App.openCamera() //可以调用App的原生JS接口了
})