Android webview拒绝执行内联脚本

时间:2014-05-25 16:02:36

标签: javascript android webview content-security-policy

我正在编写一个Android应用程序,它主持一个webview来加载网页。我在logcat中遇到了很多错误:

  

拒绝执行内联脚本,因为它违反了以下内容   内容安全策略指令:“default-src'self'”。注意   'script-src'没有明确设置,因此'default-src'用作a   回退。

请注意,如果Javascript不是内联脚本,则执行得很好。 例如,使用如下HTML文件:

<htnl>
<head>
<script type="text/javascript" src="abc.js"></script>
</head>
<body>
<script type="text/javascript">
    alert("This is inline script");
</script>
</body>
</html>

abc.js中的脚本正确执行,但内联脚本被拒绝执行。

据我所知,由于“竞争安全政策”,webview拒绝执行内联Javascript。但是网页需要执行这些内联脚本才能正常运行,我无法对网页进行任何更改。

这个问题只有KitKat(Android 4.4)

有没有办法解决这个问题,修改“内容安全策略”以允许执行内联脚本。

1 个答案:

答案 0 :(得分:1)

根据WebView开发人员提供的信息,注入的javascripts在主机页面本身运行,而不是像Chromium扩展那样在孤立的世界中运行。这就是他们应该通过内容安全策略标头(如果存在)强加的常见安全检查的原因。因此,根据标头指令(例如,如果提到src,您可能无法通过unsafe-inline属性或内联或两种方式将脚本作为文件注入将无法使用内联代码注入脚本标记。)

解决方法是使用loadUrlevaluateJavascript方法“按原样”执行javascript代码,而不添加脚本标记。例如:

webview.loadUrl("javascript:alert('hello')");

将成功执行。

对于Android 4.4及更高版本,建议使用新的evaluateJavascript方法,因为当您的应用定位到其中一个较新的Android版本时,loadUrl会产生副作用(我认为这是现在大多数项目的情况):如果脚本返回一个值 - 它将替换当前页面的DOM内容。在4.4之前的目标上,两种方法都是相同的,除了可以通过evaluateJavascript中的可选回调返回值。

人们可以想到其他技巧,但这应该足以解决你的问题。