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使用过程中的安全性问题小记,后续遇到其他安全性问题,我会及时补充。

标签:android, webview, 安全性