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


81

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

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

该代码适用于JavaScript微调器,请参见ASCII Art

该代码曾经可以正常工作,但在Camino和Firefox中仍然可以正常工作。仅当通过POST保存页面,然后通过GET检索页面时,才引发该错误。它同时在Chrome / Mac和Safari / Mac中发生。

有人知道这意味着什么,以及如何解决这个问题吗?


嗯,可能是我的WebKit已更新。该页面再次起作用。以及页面的所有旧修订(请参阅页面底部的“旧修订”按钮)。
doekman

在W3Schools的的tryit编辑器出现此错误w3schools.com/js/tryit.asp?filename=tryjs_events脚本执行的第一次,但它从您在点击“编辑,然后单击我”按钮的时刻阻止。

1
如果您按下“编辑并单击我”按钮,则文本区域的内容(使用javascript)将通过POST发送到服务器。Chrome检测到javascript已发布到服务器,并且可能是恶意的。阻止是针对XSS攻击的措施。
doekman

这里的链接,展示了如何设置头X-XSS-保护: stackoverflow.com/questions/4635403/...
hh_s

Answers:


67

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

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

另请参阅有关安全深度:新安全功能的博客文章。


5
希望能找到某种参考。
kangax

但是,该性腺会引起任何问题吗?如果我们忽略此消息,可以吗?
samach

@Greg浏览器使用什么算法来“检测情况”?不能只在数据中查找字符串“ <script>”吗?
Pacerier

1
我想在此答案与下面的Kendall答案之间进行一些讨论,涉及使用X-XSS-Protection:0 fix的含义。它会使网站受到XSS攻击吗?如果是这样,还有另一种方法可以解决此错误?
dansalmo,2012年

参考资料进一步说明了这一点,blog.chromium.org / 2010/01 /…请参阅“反射XSS保护”部分
h–

131

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

X-XSS-Protection: 0

2
确保触发此错误的页面是与此标头一起发送的,而不是提交页面。
肯德尔·霍普金斯

@KendallHopkins ....您能告诉我如何通过Javascript / Java使用它吗?
2013年

+1与接受的答案不同,这将彻底回答问题,但会发出警告,但不会提供任何解决方案。
JohnnyQ 2013年

2
-1这可能会“解决” Chrome中的问题,但不能解决真正的问题-如果您这样做,您的网站仍然容易受到跨站点脚本攻击(实际上更容易受到攻击)。@Greg暗示但未明确指出,真正的解决方案是不要在请求中提交的响应中发送回HTML / JS。阅读他提供的链接应该清楚了。
sfarbota 2015年

@sfarbota在很多情况下,此保护措施都不好。例如,它破坏了许多CMS系统,在其中完全可以返回您正在编辑的JS。但是,根据您的观点,我不建议将其添加到站点的每个页面上,并且仅在开发人员遇到此错误的情况下才需要添加。
肯德尔·霍普金斯

15

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

长答案:因为您填写的表单文本包含javascript,并且浏览器不一定知道您是javascript的来源,所以让浏览器假定您不是此JS的来源更为安全,并且不运行它。

一个例子:假设我给您一个链接,其中包含一些JavaScript,您的电子邮件或Facebook。想象一下,JavaScript将向所有朋友发送我的酷链接。因此,使该链接被调用的游戏变得简单,找到一个发送javascript的位置,使其将包含在页面中。

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

您的情况是将其提交到表单字段中。表单的发布字段将导致显示Java脚本的页面的呈现,从而使浏览器感到担忧。但是,如果您的JavaScript确实已保存,则在未提交表单的情况下访问同一页面将使其执行。


1

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

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

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

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


0

我刚提交数据库后,但在从_GET请求中渲染脚本之前,就使用了这个骇人的PHP技巧:

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.