正文
addJavascriptInterface(new JSObject(), "myObj");
第一个参数:
Android本地对象;
第二个参数:
JS代码中需要使用的对象。
所以这里看其实就相当于一个映射关系,把Android中的本地对象和JS中的对象关联即可。
那么这里就存在这样的一个问题了,
在4.2系统之前
,JS中通过对象调用的方法无需任何注解约束,那么就意味着JS中拿到这个对象,就可以调用这个对象中所有的方法。
而我们知道Android中的对象有一个公共的方法
getClass()
方法,而这个方法可以获取到当前类 类型Class,而这个类型有一个很关键的方法就是
Class.forName
,这个方法可以加载一个类,这里可以加载
java.lang.Runtime
这个类,而这个类就可以执行本地命令了,那么就会发生危险了,比如这里可以执行命令获取本地设备的SD卡中的文件等信息,非常危险的。
上面可能说的还是有些同学不太了解,
下面
就用一段简单的JS代码来了解一下:
看到这段JS之后的同学应该好理解了,因为我们Android本地通过
WebView
进行了对象映射,那么
WebView
加载页面中如果包含这段JS代码,那么就会存在这个问题,这里先遍历window中所有的对象,然后查找这个对象是否有
getClass方法
,有的话就在利用反射调用
Runtime类
执行具体命令即可。其实这个漏洞也得力于JS中的语法特性,这里可以看到JS语法非常的灵活。
当然对于 Android4.2 之后系统修复了这个漏洞,修复方法也很简单,加上注解约束:
@JavascriptInterface
就是只有加上这个注解的方法才会被JS调用,那么我们知道
getClass
是
Object类
中的,肯定没有这个注解,那么上面的JS代码肯定执行不到了。就这样解决了这个漏洞。
还有一个问题,就是Android系统默
认的会给
WebView
添加一个JS映射对象:
searchBoxJavaBridge_
这个对象是 Android3.0 之后默认加上去的,也就是说通过这个对象也是可以操作的上面的代码的。
说完了,这个漏洞,下面开始说今天的正题了,为什么要先介绍这个漏洞呢?原因就是如果要在
4.2以下版本
中解决这个漏洞的话就需要借助今天介绍的内容了,首先来看看今天的内容主要是介绍
Android 中 WebView的JS 和 本地交互 的三种方式
:
第一种方式:通过addJavascriptInterface方法进行添加对象映射
这种方式不多解释了,也是Android中最常用的方式,但是这种方式会存在风险就是上面说到的漏洞问题。
这里定义一个简单的本地对象,在需要被调用的方法加上约束注解。JS代码也很简单: