WebView安全性问题小记
在安卓开发过程中,为了追求开发的效率以及移植的便利性,使用WebView作为活动页面或者经常变动的页面是个不错的方案。那么在这种Hybrid App中,难免就会遇到页面js需要与Java相互调用,调用Java方法去做那部分网页js不能完成的功能。在最近的项目安全性测试过程中,遇到了一些WebView使用的安全性问题,做个小记。
一、JS调用Java的注入漏洞
成因
在JS调用Java代码时,最常用的方法就是调用webView.addJavascriptInterface(context,JavaInterfaceName),但是通过这种调用却给我们的应用带来了一定的安全风险,攻击者如果在页面执行一些非法的JS(例如,诱导用户打开一些钓鱼网站以进入风险页面),极有可能反弹拿到用户手机的shell权限。接下来攻击者就可以在后台默默安装木马,完全控制用户的手机。
解决方案
1.在Android 4.2 以及以后的版本中(API>=17),可以通过在注入类中为可调用的方法添加@JavascriptInterface注解,无注解的方法将不能再被调用,通过切断入口这种方式可以防范注入漏洞。
常见示例:
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
webView.addJavascriptInterface(new DemoJavaScriptInterface(), "demo");
final class DemoJavaScriptInterface {
DemoJavaScriptInterface() {
}
/**
* 从JS调用的Java方法
*/
@JavascriptInterface
public void clickOnAndroid() {
mHandler.post(new Runnable() {
public void run() {
mWebView.loadUrl("javascript:wave()");
}
});
}
}
2.对于Android 4.2以下的手机,由于本身系统的安全性就比较低,即使使用系统浏览器也会出现这种安全性问题,所以如果App安全性要求较高的话,可以参照一个开源的解决方案Safe Java-JS Bridge In Android WebView[Github]。
二、WebView自动保存密码
成因
很多时候,我们在使用WebView的过程中忽略了WebView会自动明文保存密码,如果手机未获取root权限的情况下,这样是不会有问题,但对于Android这样很容易获取root权限的系统来说,一旦root以后,就可以在应用的data目录底下找到被明文保存的密码,就会造成用户的个人敏感数据泄露。
解决方案
在初始化WebView以后,配置settings,代码如下:
webView.getSettings().setSavePassword(false);
webView.getSettings().setSaveFormData(false);
三、WebView缓存cookie数据
成因
WebView实际上可以理解是系统浏览器的一部分,所以他也会像系统浏览器一样去管理和保存cookie数据,当会话周期结束或结束当前页面以后,WebView不会主动的去清除缓存cookie数据,同样对于root以后的用户设备来说,这也是一件比较危险的事。
解决方案
在初始化WebView以后,首先配置settings,设置不保存缓存模式,代码如下:
//不使用缓存:
webView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
这样还没有结束,在退出当前页面的时候,还需要调用一下清除cookie的操作,我把清除cookie数据的操作封装成了一个工具类,代码如下:
public class CookieUtils {
/**
* 清除cookie数据
*/
public static void clearCookies(Context context){
@SuppressWarnings("unused")
CookieSyncManager cookieSyncMngr = CookieSyncManager.createInstance(context);
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.removeAllCookie();
CookieSyncManager.getInstance().sync();
}
}
以上就是我在WebView使用过程中的安全性问题小记,后续遇到其他安全性问题,我会及时补充。