本人从阿里出来,现在在杭州一家创业公司(杭州菲助科技:公司现有的产品:英语趣配音/老外趣聊/少儿趣配音,用户量已经达到400万),有兴趣一起工作的直接联系QQ:421134693
最近接到公司安全部门提出的关于app js调用的一个安全漏洞,这个漏洞是乌云平台(http://www.wooyun.org)报告出来的。
mWebView.addJavascriptInterface(new JSCallManager(), "Native");
向WebView注册一个名叫“Native”的对象,然后在JS中可以访问到Native这个对象,就可以调用这个对象的一些方法,最终可以调用到Java代码中,从而实现了JS与Java代码的交互。
但是用addJavascriptInterface可能导致不安全,因为JS可能包含恶意代码,当JS包含恶意代码时,它可以干任何事情(具体漏洞怎么模拟,会产生怎么的后果就不细说了,baidu上解释的很清楚)。
我们的app是使用hybrid app模式开发的,ios和android用到的是同一套h5页面,h5页面中js调用本地java/Oc的对象就是Native。
通过Native可以调用本地java/Oc的call(String methodName, String jsonValue)方法来跟本地进行交互。
现在要解决android4.2下js交互的安全漏洞,当然不能影响到ios的使用,也就是不能修改服务器h5的页面内容,只能针对android本地代码做处理。
最终想到的解决办法是使用WebChromeClient对象的onJsPrompt方法与js进行交互,onJsPrompt方法可以获取js传给本地的消息信息,同时可以返回消息给js,具体处理直接上代码:
1:
//这段代码在初使化webview时调用
//JSCallManager本地处理js消息的对象
if (Build.VERSION.SDK_INT >= 17) {
// 在sdk4.2以上的系统上继续使用addJavascriptInterface
webView.addJavascriptInterface(new JSCallManager(), "Native");
} else {
//4.2之前 addJavascriptInterface有安全泄漏风险
//移除js中的searchBoxJavaBridge_对象,在Android 3.0以下,系统自己添加了一个叫
//searchBoxJavaBridge_的Js接口,要解决这个安全问题,我们也需要把这个接口删除
jsCallManager = new JSCallManager();
webView.removeJavascriptInterface("searchBoxJavaBridge_");
}
2:
//WebViewClient的方法 h5开始加载的回调
public void onPageStarted(WebView view, String url, Bitmap favicon) {
// TODO Auto-generated method stub
super.onPageStarted(view, url, favicon);
if (Build.VERSION.SDK_INT < 17) {
// 在 h5开始加载时动态给js注入Native对象和call方法,模拟addJavascriptInterface
//接口给js注入Native对象
//动态注入的好处就是不影响线上的h5数据,不影响ios使用
//在onPageStarted方法中注入是因为在h5的onload方法中有与本地交互的处理
//prompt()方法是js弹出的可输入的提示框
view.loadUrl("javascript:if(window.Native == undefined){window.Native=
{call:function(arg0,arg1){prompt('{\"methodName\":' + arg0 + ',\"jsonValue\":' +
arg1 + '}')}}};");
}
}