【问题标题】:Android webview refused to execute inline scriptAndroid webview拒绝执行内联脚本
【发布时间】:2014-07-14 11:15:00
【问题描述】:

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

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

请注意,如果 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)

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

【问题讨论】:

标签: javascript android webview content-security-policy


【解决方案1】:

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

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

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

会执行成功。

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

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

【讨论】:

  • 您是否还说如果我有一个本地托管的 html 文件,该文件的标头中有外部链接的 .js 脚本(即:
猜你喜欢
  • 2020-02-12
  • 2018-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-20
  • 2019-01-27
相关资源
最近更新 更多