拒绝执行 JavaScript 脚本。在请求中找到的脚本源代码

IT技术 javascript code-injection
2021-01-30 14:25:47

在 WebKit 中,我的 JavaScript 出现以下错误:

拒绝执行 JavaScript 脚本。在请求中找到的脚本的源代码。

该代码用于 JavaScript 微调器,请参阅ASCII 艺术

过去的代码可以正常工作,并且在 Camino 和 Firefox 中仍然可以正常工作。该错误似乎只有在通过 POST 保存页面然后通过 GET 检索时才会抛出。它发生在 Chrome/Mac 和 Safari/Mac 中。

任何人都知道这是什么意思,以及如何解决这个问题?

5个回答

可以通过X-XSS-Protection在受影响的页面上发送非标准 HTTP 标头来禁用此“功能”

X-XSS-Protection: 0
+1 这完全不同于已接受的答案,但会发出警告,但没有给出任何解决方案。
2021-03-20 14:25:47
@sfarbota 在很多情况下,这种保护措施很糟糕。例如,它破坏了许多 CMS 系统,在这些系统中,返回您正在编辑的 JS 是完全可以接受的。但就您而言,我不建议将其全面添加到网站上的每个页面,并且可能仅在开发人员遇到此错误的情况下才需要。
2021-03-20 14:25:47
-1 这可能会“修复”Chrome 中的问题,但它并没有解决真正的问题 - 如果您这样做,您的站点仍然容易受到跨站点脚本攻击(实际上更容易受到攻击)。真正的解决方案,正如@Greg 提到但没有明确说明的那样,是不在请求中提交的响应中发送回 HTML/JS。阅读他提供的链接应该已经清楚了。
2021-04-04 14:25:47
@KendallHopkins ....你能告诉我如何通过Javascript/Java使用它吗?
2021-04-09 14:25:47
确保触发此错误的页面与此标头一起发送,而不是提交页面。
2021-04-10 14:25:47

这是一种防止XSS(跨站点脚本)攻击的安全措施

当一些 JavaScript 代码通过 HTTP POST 请求发送到服务器,并且相同的代码通过 HTTP 响应返回时,就会发生这种情况。如果 Chrome 检测到这种情况,脚本将被拒绝运行,并且您会收到错误消息Refused to execute a JavaScript script. Source code of script found within request

另请参阅有关“深入安全:新安全功能”的博客文章

进一步解释这一点的参考资料,blog.chromium.org/2010/01/...请参阅反射 XSS 保护部分
2021-03-20 14:25:47
但这会引起任何问题吗?意思是如果我们忽略这条消息可以吗?
2021-03-25 14:25:47
很高兴看到某种参考。
2021-03-28 14:25:47
@Greg 浏览器使用什么算法来“检测情况”?它不能只是在数据中寻找字符串“<script>”,对吗?
2021-04-07 14:25:47
我想在这个答案和下面 Kendall 的答案之间看到一些关于使用 X-XSS-Protection: 0 修复的含义的讨论。它会打开站点以防止 XSS 攻击吗?如果是这样,还有其他方法可以解决此错误吗?
2021-04-08 14:25:47

简短回答:在首次提交 javascript 后刷新页面,或点击将显示您正在编辑的页面的 URL。

长答案:因为你在表单中填写的文本包含 javascript,而浏览器不一定知道你是 javascript 的来源,浏览器假设你不是这个 JS 的来源会更安全,并且不运行它。

一个例子:假设我给了你一个包含一些 javascript 的电子邮件或 facebook 链接。想象一下,javascript 会向你所有的朋友发送我的酷链接。因此,调用该链接的游戏变得很简单,找到一个发送 javascript 的地方,以便将其包含在页面中。

Chrome 和其他 WebKit 浏览器试图通过不执行响应中的任何 javascript(如果它存在于请求中)来降低这种风险。我的恶意攻击将被挫败,因为您的浏览器永远不会运行该 JS。

在您的情况下,您将其提交到表单字段中。表单字段的 Post 会导致页面呈现显示 Javascript,从而导致浏览器担心。但是,如果您的 javascript 确实已保存,则在不提交表单的情况下点击同一页面将允许它执行。

正如其他人所说,当 HTTP 响应包含也在请求中的 JavaScript 和/或 HTML 字符串时,就会发生这种情况。这通常是由于在表单字段中输入 JS 或 HTML 引起的,但也可以通过其他方式触发,例如手动调整 URL 的参数。

这样做的问题是,有恶意的人可以将他们想要的任何 JS 作为值,使用恶意 JS 值链接到该 URL,并给您的用户带来麻烦。

几乎所有情况下,这都可以通过对响应进行HTML 编码来解决,但也有例外。例如,这对于<script>标签内的内容是不安全的其他特定情况可以以不同方式处理 - 例如,将输入注入 URL 可以更好地通过 URL 编码提供服务。

正如 Kendall Hopkins 所提到的,在某些情况下,您确实希望表单输入中的 JavaScript 被执行,例如创建像JSFiddle这样的应用程序在这些情况下,我建议您在盲目地写回之前至少检查后端代码中的输入。之后,您可以使用他提到的方法来防止 XSS 阻塞(至少在 Chrome 中是这样),但请注意,它正在向攻击者开放。

在提交到数据库之后,但在根据我的_GET请求呈现脚本之前,我使用了这个 hacky PHP 技巧。:

if(!empty($_POST['contains_script'])) { 
    echo "<script>document.location='template.php';</script>";
}

这对我来说是最便宜的解决方案。