在 WebKit 中,我的 JavaScript 出现以下错误:
拒绝执行 JavaScript 脚本。在请求中找到的脚本源代码。
该代码用于 JavaScript 微调器,请参阅ASCII Art。
以前的代码可以正常工作,并且在 Camino 和 Firefox 中仍然可以正常工作。该错误似乎仅在通过 POST 保存页面然后通过 GET 检索时引发。它发生在 Chrome/Mac 和 Safari/Mac 中。
任何人都知道这意味着什么,以及如何解决这个问题?
在 WebKit 中,我的 JavaScript 出现以下错误:
拒绝执行 JavaScript 脚本。在请求中找到的脚本源代码。
该代码用于 JavaScript 微调器,请参阅ASCII Art。
以前的代码可以正常工作,并且在 Camino 和 Firefox 中仍然可以正常工作。该错误似乎仅在通过 POST 保存页面然后通过 GET 检索时引发。它发生在 Chrome/Mac 和 Safari/Mac 中。
任何人都知道这意味着什么,以及如何解决这个问题?
X-XSS-Protection
可以通过在受影响的页面上发送非标准 HTTP 标头来禁用此“功能” 。
X-XSS-Protection: 0
这是一种防止XSS(跨站点脚本)攻击的安全措施。
当一些 JavaScript 代码通过 HTTP POST 请求发送到服务器,并且相同的代码通过 HTTP 响应返回时,就会发生这种情况。如果 Chrome 检测到这种情况,脚本会被拒绝运行,并且您会收到错误消息Refused to execute a JavaScript script. Source code of script found within request
。
另请参阅有关深度安全性的博文:新的安全功能。
简短回答:在初次提交 javascript 后刷新页面,或点击显示您正在编辑的页面的 URL。
长答案:因为您填写的表格中的文本包括javascript,并且浏览器不一定知道您是javascript的来源,所以浏览器假设您不是这个JS的来源更安全,并且不要运行它。
一个例子:假设我给了你一个链接,你的电子邮件或 Facebook 里面有一些 javascript。想象一下,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>";
}
这对我来说是最便宜的解决方案。