【问题标题】:Refused to execute a JavaScript script. Source code of script found within request拒绝执行 JavaScript 脚本。在请求中找到的脚本源代码
【发布时间】:2010-12-05 14:16:56
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 嗯,可能我的 WebKit 已经更新了。该页面再次工作。还有页面的所有旧版本(请参阅页面底部的旧版本按钮)。
  • 这个错误出现在w3schools的tryit编辑器w3schools.com/js/tryit.asp?filename=tryjs_events脚本第一次执行,但是从你点击“编辑并点击我”按钮的那一刻起就被屏蔽了。
  • 如果您按下“编辑并单击我”按钮,textarea 的内容(使用 javascript)将通过 POST 发送到服务器。 Chrome 检测到 javascript 已发布到服务器,它可能是恶意的。拦截是针对XSS攻击的措施。
  • 这里是显示如何设置标头 X-XSS-Protection 的链接:stackoverflow.com/questions/4635403/…

标签: javascript code-injection


【解决方案1】:

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

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

几乎在所有情况下,这都可以通过HTML encoding the response 修复,但也有例外。例如,这对于 <script> 标记内的内容是不安全的。其他特定情况可以以不同方式处理 - 例如,将输入注入 URL 最好使用 URL 编码。

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      X-XSS-Protection: 0
      

      【讨论】:

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

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

      长答案:由于您填写的表格中包含javascript,而浏览器不一定知道您是javascript的来源,因此浏览器假设为更安全你不是这个JS的来源,不要运行它。

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

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

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

      【讨论】:

        【解决方案5】:

        这是一种防止XSS (cross-site scripting)攻击的安全措施。

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

        另请参阅有关 Security in Depth: New Security Features 的博文。

        【讨论】:

        • 很高兴看到一些参考。
        • 但这会引起什么问题吗?意思是我们可以忽略这条消息吗?
        • @Greg 浏览器使用什么算法来“检测情况”?不可能只是在数据中寻找字符串“
        • 我希望看到以下 Kendall 的答案与使用 X-XSS-Protection: 0 修复的含义之间的一些讨论。它是否会打开网站遭受 XSS 攻击?如果是这样,还有其他方法可以解决此错误吗?
        • 进一步解释这一点的参考,blog.chromium.org/2010/01/… 请参阅反射型 XSS 保护部分
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-12
        • 2014-09-03
        • 2019-01-27
        • 2018-05-29
        • 2014-07-14
        相关资源
        最近更新 更多