【问题标题】:X-XSS-Protection false positive?X-XSS-保护误报?
【发布时间】:2014-04-28 18:06:28
【问题描述】:

我的 webapp 在进入 safari 时遇到了一个奇怪的行为(FF 完全没有问题)。

代码很简单:

  • 我有一个包含一些复选框的表单。
  • 我点击提交按钮,通过 POST 将数据发送到同一页面,其中 PHP 脚本写入了一个 cookie
  • 然后,PHP 重新加载带有 header("Location:index.php"); 的同一页面;

不幸的是,我在 Safari 中收到以下错误:

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

该页面不发送 javascript 或 URL 或其他恶意代码。 它只是从表单中发布数据。 那么,我该如何避免这种情况呢? 谁能解释为什么 safari 告诉我我想执行 javascript 代码? (当然,在页面顶部添加“header(”X-XSS-Protection:0“);”可以解决问题。但我对这种对策不太满意......)

这是代码的一些相关部分(简化):

<?php
if(@$_POST["foo"] == "yes"){
    $choice = join("-", $_POST["choice"]);
    setcookie("bar",$choice, time()+900000);
    header("Location:index.php");
    }
?>


<form method="post" action="index.php">
<input type="hidden" name="foo" value="yes">
<p><input type='checkbox' name='choice[]' value='foo'> foo</p>
<p><input type='checkbox' name='choice[]' value='bar'> bar</p>
<p><input type='checkbox' name='choice[]' value='baz'> baz</p>
<input type="submit">
</form>

提前感谢您的回复!

编辑:

  • 我强烈怀疑我最喜欢的 Safari (5) 版本中存在错误,因为代码在 safari 6 (ML)、firefox 和 chrome 中运行良好。
  • 将 setcookie 部分放在页面顶部并在 header("location:") 之后立即调用“exit”并不能解决问题。
  • 即使我将 setcookie 放在单独的 PHP 脚本中并从这个新页面中重新加载页面,我在 safari 5 中也遇到了同样的错误。

应silverlightfox的要求,以下是2个页面的http响应头截图:

【问题讨论】:

  • 不确定,但你能将你的输入命名为choice[]吗?应该只是choice吗?
  • @Sable 他当然可以,而且如果他想要一个数组就必须这样做。这与问题无关
  • 您能否将导致错误出现的页面的完整 HTTP 响应添加到您的答案中?
  • 请查看我对 HTTP 响应屏幕截图的修改。
  • 我怀疑此警告来自名称name='choice[]' 中的方括号,您可以尝试不使用这样的方括号吗:name='choice'

标签: php security xss


【解决方案1】:

设置Location 标头后,您应该调用exit

这将阻止对您的页面进行更多处理,并且不会将其余响应发送到浏览器(HTML 内容仍将被发送,即使您正在重定向,如果您不调用 exit)。

我的猜测是在您的页面某处输出了未编码的参数(在您的问题中的代码 sn-p 中不存在)。查看页面输出以查看您的 HTML 内容是否在发送重定向标头后无意中在 HTTP 响应正文中生成了任何 JavaScript 代码。

【讨论】:

  • 感谢您的回复,但在我的情况下它不起作用。请看我的编辑:我认为这只是我使用的浏览器的一个错误......
  • @SilverlightFox 注意重定向响应的 Content-Length 标头如何为零?该响应正文中没有发送任何内容。
猜你喜欢
  • 2015-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-14
  • 2014-02-10
  • 2012-08-17
  • 1970-01-01
相关资源
最近更新 更多