来自XSS的$ _SERVER ['QUERY_STRING']安全吗?

时间:2011-01-03 03:11:13

标签: php http xss

我需要构建一个表单,其动作将您带回到完全相同的页面 - 包括GET参数。我想我可以说出一些效果:

echo '<form action="'.$_SERVER['SCRIPT_NAME'].'?'.$_SERVER['QUERY_STRING'].
     '" method="post">'

这似乎有效,并且测试通过一些XSS攻击似乎是成功的,因为QUERY_STRING的输出似乎是URL编码的。但是PHP documentation没有提到这一点,所以我不相信我会相信这种行为。

以我上面的方式使用QUERY_STRING是否安全?如果没有,我该怎么办呢?我们将不胜感激参考文献。

更新切换到SCRIPT_NAME,只是混淆了哪一个是好的,这对我来说很糟糕,谢谢你抓住我。 action=""确实很好地解决了我的具体问题,但我仍然很好奇QUERY_STRING是否经过预处理,因此可以安全使用或不使用,因为有时您可能想重新使用查询字符串,假设这样做是安全的。

5 个答案:

答案 0 :(得分:8)

你永远不要相信$ _SERVER ['QUERY_STRING']因为它可以用于XSS攻击。

在您的情况下,可以通过以下方式利用此漏洞:

http://your.server.com/your_script.php?"><script>alert(111);</script>

请注意,上面的代码适用于IE; FireFox和Chrome会在将查询字符串发送到Web服务器之前对其进行高效编码。

我总是用htmlentities(请注意double_encode参数)将其与每个用户输入一起包装。

祝你好运!

答案 1 :(得分:1)

首先,你不能相信$ _SERVER ['PHP_SELF'](1) - 改为使用$ _SERVER ['SCRIPT_NAME']。

对于$ _SERVER ['QUERY_STRING'],您应该将其视为任何其他用户输入。在输出中使用它之前将其过滤掉。在这种情况下,我不建议使用某种通用过滤器。最好从您希望在那里的特定部分重新组装查询字符串。

答案 2 :(得分:1)

如果XSS可以利用它,首先你需要知道哪个攻击。在这里发布的代码中只有一个simple attack使用PHP_SELF。

但是,为了避免任何问题,您可以将表单操作留空。这会将表单发送到包含查询字符串的同一页面。

答案 3 :(得分:0)

我无法想到任何可以起作用的攻击,但是PHP_SELF本身很容易受到攻击,你使用QUERY_STRING时没有任何过滤,这似乎很奇怪。

为什么不将action参数留空并让浏览器决定?如果您想要倍加肯定,可以使用Javascript在客户端正确执行此行为。

答案 4 :(得分:0)

这是另一个使用PHP filter_input的实例。每当我打开直接访问$_POST$_GET$_SERVER$_COOKIE的代码而不通过filter_input时,我的IDE NetBeans(讨厌或喜欢它)总会抱怨

这是因为上述原因 - 您说您信任外部数据,如果它可以由用户输入或操纵,则不能。

filter_input(INPUT_POST, 'id', FILTER_SANITIZE_NUMBER_INT);
filter_input(INPUT_SERVER, 'QUERY_STRING', FILTER_SANITIZE_STRING);

了解更多here