我需要构建一个表单,其动作将您带回到完全相同的页面 - 包括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是否经过预处理,因此可以安全使用或不使用,因为有时您可能想重新使用查询字符串,假设这样做是安全的。
答案 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