Android webview拒绝执行内联脚本

Android webview refused to execute inline script

本文关键字:脚本 拒绝执行 webview Android      更新时间:2023-09-26

我正在编写一个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)

是否有办法克服这个问题,修改"内容安全策略"以允许内联脚本执行

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

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

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

将被成功执行。

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

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