专栏名称: 郭霖
Android技术分享平台,每天都有优质技术文章推送。你还可以向公众号投稿,将自己总结的技术心得分享给大家。
目录
相关文章推荐
复利大王  ·  卷疯了:食堂档口末位淘汰 ·  12 小时前  
复利大王  ·  头等舱的空姐 ·  12 小时前  
复利大王  ·  性萧条时代的东莞要振兴KTV产业 ·  12 小时前  
复利大王  ·  北大软微男在女厕所偷拍! ·  昨天  
复利大王  ·  北京97师大美女征友 ·  2 天前  
51好读  ›  专栏  ›  郭霖

WebView的JavaScript与本地代码三种交互方式

郭霖  · 公众号  · android  · 2016-09-30 08:03

正文

请到「今天看啥」查看全文


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 之后默认加上去的,也就是说通过这个对象也是可以操作的上面的代码的。

JS代码与本地代码交互

说完了,这个漏洞,下面开始说今天的正题了,为什么要先介绍这个漏洞呢?原因就是如果要在 4.2以下版本 中解决这个漏洞的话就需要借助今天介绍的内容了,首先来看看今天的内容主要是介绍 Android 中 WebView的JS 和 本地交互 的三种方式

第一种方式:通过addJavascriptInterface方法进行添加对象映射

这种方式不多解释了,也是Android中最常用的方式,但是这种方式会存在风险就是上面说到的漏洞问题。

这里定义一个简单的本地对象,在需要被调用的方法加上约束注解。JS代码也很简单:







请到「今天看啥」查看全文