2015年7月

在安卓开发过程中,为了追求开发的效率以及移植的便利性,使用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使用过程中的安全性问题小记,后续遇到其他安全性问题,我会及时补充。

最近发现gradle在使用过程中,由于功夫墙的原因更新略慢,所以就折腾在自己的服务器上部署下私有仓库代理,首先在私有仓库中查找是否已经有依赖包,如果没有再重远程中央仓库中去下载到本地,这样的好处就是可以减少对于中央仓库的依赖,减轻中央仓库压力。由于我的服务器直连国外,所以从中央仓库中去下载的速度也是很快的,基本上可以满足团队开发。

一.首先给CentOS安装JDK

1.查看CentOS自带JDK是否已安装,输入:

yum list installed |grep java

一般来说,如果是新装CentOS系统的话,不会有JDK,如果有的话,就执行相关卸载操作,大概会是这样的:

openjdk

yum -y remove java-1.7.0-openjdk*

tzdata-java

yum -y remove tzdata-java.noarch

一般会有卸载完毕提示。

2.开始安装oracle jdk

查看yum库中的Java安装包

yum -y list java*

会出现一堆列表,然后翻看下最新的jdk版本号,我安装的是1.8.0,将java-1.8.0相关的都安装上:

yum -y install java-1.7.0-openjdk*

3.查看刚安装的Java版本信息,输入:

java -version

至此,jdk已经安装完毕了。

二.安装Sonatype Nexus

Sonatype Nexus是现在比较流行和成熟的私有仓库搭建工具,透过nexus可以很轻松的搭建私有仓库,而且搭建起来也非常容易。

1.下载nexus,进入http://www.sonatype.org/nexus/archived/页面,选择一个最新的压缩包,下载到服务器:

wget http://download.sonatype.com/nexus/oss/nexus-2.11.1-01-bundle.tar.gz

2.解压

tar zxvf nexus-2.11.1-01-bundle.tar.gz

3.移动到其他目录

mv nexus-2.1.2 /usr/loal/nexus

4.设置为系统自启动服务

cd /etc/init.d/
cp /usr/local/nexus/bin/jsw/linux-x86-32/nexus nexus

5.编辑/etc/init.d/nexus文件,添加以下变量定义:

NEXUS_HOME=/usr/local/nexus
PLATFORM=linux-x86-32
PLATFORM_DIR="${NEXUS_HOME}/bin/jsw/${PLATFORM}"

修改以下变量:

WRAPPER_CMD="${PLATFORM_DIR}/wrapper"
WRAPPER_CONF="${PLATFORM_DIR}/../conf/wrapper.conf"
PIDDIR="${NEXUS_HOME}"

修改如下变量,设置启动用户为root:

RUN_AS_USER=root

6.执行命令添加nexus自启动服务

chkconfig –add nexus
chkconfig –levels 345 nexus on

7.执行如下命令启动、停止nexus服务

service nexus start
service nexus stop

至此,nexus安装完毕

三.验证和配置Nexus

nexus安装完成以后,一般在路径: http://sever_ip:8081/nexus/ 打开以后会出现配置管理页面,说明安装成功了。点击右上角“Log in”,输入用户名和密码(默认用户名:admin密码:admin123)登录。

nexus里面有很多功能,对于我来说只需要用到 proxy 这个功能,主要是代理远程中央仓库,并缓存数据到私有仓库,具体配置过程也很简单,就不多赘述了,由于我安装过程中没有截图,所以只能去截个已经安装好的图

QQ20150711-1@2x.png

好了,放大招了,贡献上我的jcenter镜像:http://jcenter.chengyong.net
---- 2016.08.17 update -----
由于服务器扛不住了,只能停掉了jcenter,有需要的可以使用:
开源中国:http://maven.oschina.net/content/groups/public/
ibiblio:http://mirrors.ibiblio.org/maven2/
jboss:http://repository.jboss.org/nexus/content/groups/public/
maven2:http://repo2.maven.org/maven2/