您的位置:首页 > 移动开发 > Android开发

Android4.2下 WebView的addJavascriptInterface漏洞解决方案

2015-07-22 10:56 597 查看
本人从阿里出来,现在在杭州一家创业公司(杭州菲助科技:公司现有的产品:英语趣配音/老外趣聊/少儿趣配音,用户量已经达到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 + '}')}}};");

}

}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: