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

Android:你所忽略 WebView 带来的那些安全漏洞(总结)

2017-05-08 08:29 1361 查看
WebView是一个基于webkit引擎、展现web页面的控件。它功能强大,除了具有一般View的属性和设置外,还可以对url请求、页面加载、渲染、页面交互进行强大的处理。但是在使用的同时也埋下了一些安全隐患和内存泄漏,接下来以此篇文章作简单总结:

一. WebView常见的一些坑

1.动态添加WebView带来的 内存泄漏

一般在使用WebView都是写在容器中,例如RelativeLayout、LinerLayout。为避免内存泄漏,在使用完后,会调用以下方法来销毁WebView:

webView.removeAllViews();
webView.destroy();


注意: 容易忽视的一点,当我们在初始化布局时,如果是调用
addView
方法即动态添加WebView到布局文件中时,需要先将布局中的WebView先remove出来,再调用Webview的两个方法来销毁自己。这样才能真正的销毁WebView对象,避免内存泄漏。

2. WebView的 onPageFinished方法

问题描述: WebView加载的页面完成时会回调
onPageFinished
方法,但是此方法有很多坑,它会判断此网页是否真的加载完毕,若此时在加载过程中产生跳转,此方法会被调用无数次。

解决方法:所以当你的WebView需要加载各种网页并且需要在网页上完成一些操作时,推荐使用WebView 的
onProgressChanged
方法,此方法相较于之前的更为稳定、靠谱。

3. WebView带来的 后台耗电隐患

问题描述:当我们使用到WebView加载网页时,WebView会自己开启线程,如果在使用完后没有彻底销毁,这些残余的线程会一直在后台运行导致应用程序大幅度耗电。

解决方法:这里提供一个方法,有些暴力,仅做思考:在Activity的
onDestory
方法中调用
System.exit
直接把虚拟机关闭。

4. WebView硬件加速导致 页面渲染问题

问题描述:硬件加速开始于Android 系统3.0,开启硬件加速后,WebView渲染页面加速,拖动起来效果更加顺滑。但是这里有一个问题,容易出现加载页面白块、界面闪烁的现象。

解决方法:设置WebView暂时关闭硬件加速。

5. jsbridge

其实jsbridge不算是一个坑,在此简介其概念:它通过JavaScript来构建桥,桥的其中一端是Web端,另一端是客户端native,而搭桥的目的是为了本地native端调用Web的js代码,同时Web端可以调用本地native代码,仅做了解即可。

6. WebView 的 addJavascriptInerface方法带来的 安全漏洞

Android API level 16以及之前的版本存在远程代码执行安全漏洞,该漏洞源于程序没有正确限制使用
WebView.addJavascriptInerface
方法,远程攻击者可通过使用 Java Reflection API 利用该漏洞执行任意Java对象的方法。

此方法
addJavascriptInerface
给WebView加入了一个Javascript桥接口,而此桥接口可以通过调用来操纵本地的Java接口。这是前几年WebView出现问题十分显著的一次,攻击者利用反射机制调用未注册的其它Java类,导致操纵JavaScript能力无限增强,攻击者利用此漏洞对客户端任意篡改,甚至进行违法行为。

二. 有关 WebView 的内存泄漏问题

1. 内存泄漏的 根本原因

WebView的使用会关联一个Activity,而WebView执行的操作是在新的线程中,Activity的生命周期和这些新线程的生命周期不同,导致WebView一直持有Activity的引用,不能回收!其中原理与匿名内部类持有外部类引用导致外部类无法回收 一样。

2. 解决方法

为避免此现象,有以下两个方法:

(1)独立进程

此方法简单暴力,就是开启单独一个进程给WebView,不过可能涉及到进程间通信,这会比较麻烦。

此方法在过程中用处较多,WebView使用完后直接干掉此进程,使app的主进程减少一些内存容量。

(2)动态添加WebView,对传入WebView中使用的Context使用弱引用

动态添加WebView是指在布局外创建一个ViewGroup来防止WebView,通过代码在创建Activity时将WebView添加add进来。不仅如此,开头已经提到过,在销毁WebView时,即Activity的
onDestory
方法中,先将WebView从Activity的布局中remove掉,再调用webView的销毁方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: