现在的位置: 首页 > 综合 > 正文

Android WebView安全讨论

2017年12月15日 ⁄ 综合 ⁄ 共 1991字 ⁄ 字号 评论关闭

Android WebView安全问题相信大家都遇到过,今天我专门开一个帖子和大家讨论一下如何
正确的对待WebView的安全问题。我提出的解决方式也许不是最好的,可能还会有很多其他的更好的解决方案,我在这里也仅仅是抛砖引玉,希望大家能提出更好的解决方案出来,能让大家在讨论中都能获益。

下面我先抛出两个WebView的主要问题
(1)关于Javacript和Java通信的桥的问题。
(2)关于客户端本地文件防篡改和注入的问题。

第一个问题,乌云上爆出了好多,下面给出几个链接,大家先了解一下所面临的问题,之后会
给出一个解决方案出来。
http://www.wooyun.org/bugs/wooyun-2010-050031
http://www.wooyun.org/bugs/wooyun-2010-045163
http://www.wooyun.org/bugs/wooyun-2010-045671
http://www.wooyun.org/bugs/wooyun-2010-045011 

第二个问题,乌云上有个类似的问题,我感觉本地的html会有被篡改的可能性的。比如
手机root过,那么病毒或者流氓软件进行篡改或者获取信息将会轻而易举,同时满足这两个
条件比较难,只要不把敏感信息存放到本地磁盘,或者加密存储,安全性问题不算太大。

http://www.wooyun.org/bugs/wooyun-2010-047085

第一个问题先简单的描述一下问题所在,Android提供了一个Java代码和js代码通信的一个很好的
方式,叫做JavascriptInterface,可以用任何的Java对象当做Java和javascrip的通信接口。
这样就可以实现在js函数中调用Java中的对象的方法。但是这个机制在系统版本4.2之前有一个
安全性的漏洞或者bug,只要设置了这个调用接口,js可以甚至调用Java中的任何对象的方法,乌云上已经给出了例子。4.2及之后版本已经修复了这个bug,只有用 @JavascriptInterface 注解修饰的方法才能被调用,否则无法被调用,4.2之前不管是否用此注解修饰都会被调用。所以在低版本的系统中会存在此安全问题。毕竟使用4.2一下的手机市场占有率也很大,所以还需要考虑使用新的解决方案,暂时弃用此接口方案。

解决第一个问题毕竟成熟的方案就是通过WebChromeClient的
public boolean onJsPrompt(WebView view, String
url, final String message,String defaultValue, JsPromptResult result) 

的这个方法,调用Java代码。在js代码中使用prompt(“调用Java代码”),然后会回调onJsPrompt方法,message参数值就是js中prompt函数的参数值“调用Java代码”。
通过这种方式我们可以做很多事情,这个message我们可以做一个桥接协议,让js告诉Android客户端(当然也可以告诉ios客户端,ios客户端一般采用轮询的方式获取js的调用)做指定需要做的事情,比如调用Java代码的定位代码等,陀螺仪等等,也可以把回调js的函数传过来,调用完Java代码之后,让Java代码再回到js代码,把结果传递给html,这个回调函数可以随机生成,js可以随机生成函数名称。
这个message可以定义一套桥接协议,只有自己的程序知道就行了。
这样就解决了js调用Java代码的安全问题。

当然还有其他的解决方案,欢迎大家相互交流。

解决第二个问题最好的方式是,不要存储在本地,有时候缓存文件是不可避免的,那就
对本地文件进行加密和完整性验证吧。
对于本地的html文件的验证可以使用加密的zip的方式进行实时的把需要加载的文件传递给webview就好了,
可以使用WebViewClient的下面这个方法,返回一个包装了文件流的WebResourceResponse对象即可。 
@Overridepublic WebResourceResponse shouldInterceptRequest(WebView
view, String url) { 
  WebResourceResponse
response =  new WebResourceResponse(...)  
return response; 
}


这个方法也可做自己的手工缓存处理的策略,自己扩展就好了。
还有一点,这个方法在4.0以下手机中,有的不好使,需要注意一下。

以上两种解决方案也许不怎么难,但是确实可以解决上述的安全问题,提高客户端的webview的安全性。
以上解决方式只是作为抛砖引玉只用,可能考虑不够周全,也请各位海涵。
欢迎大家一起讨论一下,看看webview还涉及什么安全问题

抱歉!评论已关闭.