Android webview 拒绝执行内联脚本

问题描述 投票:0回答:2

我正在编写一个 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中的脚本正常执行,但内联脚本被拒绝执行。

我了解到,由于“Contect Security Policy”,webview 拒绝执行内联 Javascript。但是网页需要执行这些内联脚本才能正常运行,并且我无法在网页上进行任何更改。

此问题仅KitKat (Android 4.4)

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

javascript android webview content-security-policy
2个回答
1
投票

根据 WebView 开发人员的信息,注入的 javascript 在主机页面本身中运行,而不是像 Chromium 扩展那样在一个孤立的世界中运行。这就是为什么它们应该通过内容安全策略标头(如果存在)施加的常见安全检查。因此,不可能通过

src
属性或内联或以两种方式将脚本作为文件注入,具体取决于标头指令(例如,如果提到
unsafe-inline
,您将无法注入带有内联代码的脚本标签)。

解决方法是使用

loadUrl
evaluateJavascript
方法“按原样”执行 javascript 代码,而不添加脚本标签。例如:

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

将会成功执行。

对于 Android 4.4 及更高版本,建议使用新的

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

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


0
投票

我有

拒绝应用内联样式,因为它违反了以下规定 内容安全策略指令:“default-src 'self'”。要么是 需要“unsafe-inline”关键字、哈希值或随机数(“nonce-...”) 启用内联执行。另请注意,“style-src”不是 显式设置,因此“default-src”用作后备。

并通过

解决了这个问题
webView.settings.domStorageEnabled = true
© www.soinside.com 2019 - 2024. All rights reserved.