我正在使用Webview
和Javascript
制作addJavascriptInterface(true)
.
我的应用程序将包含将从外部站点加载的数据(html)。
当我启用 addJavascriptInterface(true) 时,我担心我的应用程序的跨站点脚本 XSS/安全性。
我应该注意哪些事情,以免任何恶意代码在我的应用程序上运行?
我正在使用Webview
和Javascript
制作addJavascriptInterface(true)
.
我的应用程序将包含将从外部站点加载的数据(html)。
当我启用 addJavascriptInterface(true) 时,我担心我的应用程序的跨站点脚本 XSS/安全性。
我应该注意哪些事情,以免任何恶意代码在我的应用程序上运行?
我从 Syracuse 大学找到了一项名为Attacks on WebView in the Android System的很好的研究,它说明了使用WebView
withaddJavascriptInterface(true)
如何启用两种攻击。一是恶意网站现在可以通过您分配给界面的电话服务(例如联系人、相机等)访问您的应用程序,二是恶意应用程序可以通过将代码插入到易受攻击的网站访问它的Javascript。
基本上,应用程序开发人员的解决方法是确保WebView
在您的 WebView 中不允许查看除预期之外的其他 URL。例如,假设您将 Facebook.com 嵌入到您WebView
的WebView
. 这在 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);
这是一项很棒的研究,并概述了几种不同的攻击方式。值得一读!
当您为其启用 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 或更高版本上运行时,您的网页将无法访问该方法。
我写了这个要点来帮助锁定Android的Webview,类似于@Noni A的回答它只允许通过覆盖加载白名单的url,shouldOverrideUrlLoading
但shouldInterceptRequest
我相信AJAX类型调用也会使用它。