20

我正在使用WebviewJavascript制作addJavascriptInterface(true).

我的应用程序将包含将从外部站点加载的数据(html)。

当我启用 addJavascriptInterface(true) 时,我担心我的应用程序的跨站点脚本 XSS/安全性。

我应该注意哪些事情,以免任何恶意代码在我的应用程序上运行?

4

3 回答 3

22

我从 Syracuse 大学找到了一项名为Attacks on WebView in the Android System的很好的研究,它说明了使用WebViewwithaddJavascriptInterface(true)如何启用两种攻击。一是恶意网站现在可以通过您分配给界面的电话服务(例如联系人、相机等)访问您的应用程序,二是恶意应用程序可以通过将代码插入到易受攻击的网站访问它的Javascript。

基本上,应用程序开发人员的解决方法是确保WebView在您的 WebView 中不允许查看除预期之外的其他 URL。例如,假设您将 Facebook.com 嵌入到您WebViewWebView. 这在 iFrame 中最为常见……尽管本文对此进行了更深入的探讨。

这是他们提供的示例,可确保在WebView原始预期之外的其他 URL 中查看:

WebViewclient wvclient = New WebViewClient() {
  // override the "shouldOverrideUrlLoading" hook.
  public boolean shouldOverrideUrlLoading(WebView view,String url){
    if(!url.startsWith("http://www.facebook.com")){
    Intent i = new Intent("android,intent.action.VIEW",
    Uri.parse(url));
    startActivity(i);
  }
}
// override the "onPageFinished" hook.
public void onPageFinished(WebView view, String url) { ...}
}
webView.setWebViewClient(wvclient);

这是一项很棒的研究,并概述了几种不同的攻击方式。值得一读!

于 2015-02-20T07:54:01.560 回答
16

当您为其启用 javascript时,4.2 之前的 webview 中存在漏洞 。

使用启用 Javascript:

启用 JavaScript 后,您可以在应用程序代码和 JavaScript 代码之间创建接口。

addJavascriptInterface(对象对象,字符串名称)方法:

addJavascriptInterface 方法将提供的 Java 对象注入 WebView。

使用提供的名称将对象注入到主框架的 JavaScript 上下文中,这允许从 JavaScript 访问 Java 对象的方法。

对于运行 Android 4.1 或更早版本的应用程序,所有公共方法(包括继承的方法)都可以访问,因此当用户使用 addJavascriptInterface 方法安装的应用程序加载外部网页时,它可以使用 WebView 和 javascript 调用 java 对象(如 'Javascript管道”和使用反射来调用任何其他未注册的 Java 类)允许攻击者调用 Android 的 Java 方法。

修复:

对于运行 Android 4.2 的应用程序,所有使用 JavascriptInterface 注释的公共方法都可以从 JavaScript 访问。

因此,如果您为 SDK 版本 17 或更高版本开发应用程序,则必须将 @JavascriptInterface 注释添加到您希望 JavaScript 可用的任何方法。

如果您不提供注释,则在 Android 4.2 或更高版本上运行时,您的网页将无法访问该方法。

参考

于 2013-09-30T08:47:59.710 回答
1

我写了这个要点来帮助锁定Android的Webview,类似于@Noni A的回答它只允许通过覆盖加载白名单的url,shouldOverrideUrlLoadingshouldInterceptRequest我相信AJAX类型调用也会使用它。

于 2016-02-18T15:07:20.840 回答