混合App的JS接口安全设计

原生框架+网页的混合App的开发速度确实很快,很多公司的项目为了追求开发效率都会选择这种开发方式,我公司的App也是这样子的架构。

这种开发方式,原生接口一旦被滥用,很容易带来安全隐患。

事故

最近公司在App上推广一个投票活动进行拉新,结果发生了意外:有人写了一个网页,在App里面访问,通过JS接口恶意进行刷票。

解决方案

对于JS接口,其实微信的 JSSDK 在安全设计方面已经铺好路,下面总结一下解决方案。

绑定域名

限制能调用JS接口的域名,而且为每个域名分配独立的id和secret,示例:

域名domain_idsecret
app.domain.com1000010a302f7e-4c4c-420c-87d9-b7955efd8fe9
page.domain.com1000020affa486-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接口了
})