是否存在使用$_SERVER['REQUEST_URI']
或$_SERVER['PHP_SELF']
作为表单中的操作或链接中的href的风险?
如果是这样,可以采取哪些措施来减轻风险呢?
答案 0 :(得分:3)
$ _ SERVER容易受到XSS攻击,应该在使用前使用htmlspecialchars()进行清理。
注射示例:
<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>"></form>
现在使用以下注入调用表单:
http://www.example.com/form.php/%22%3E%3Cscript%3Ealert('xss attack')%3C / script%3E%3Cbr%20class =%22irrelevant
始终记得清理输入数据......总是!
答案 1 :(得分:2)
这是因为$_SERVER['PHP_SELF']
和$_SERVER['REQUEST_URI']
可以通过某种方式进行操作,如果你没有正确地逃避它,它可以用于XSS攻击。< / p>
通过像这样的URL可以正常运行这一事实可以实现这一点:
/path/to/index.php/" onmouseover="alert('hi')
让我们使用这段代码:
<form action="<?php echo $_SERVER['PHP_SELF']; ?>">
...
</form>
它会调用/path/to/index.php
,即SCRIPT_NAME
,但当您回显$_SERVER['PHP_SELF']
时,它会破坏您的预期HTML。
<form action="/path/to/index.php/" onmouseover="alert('hi')">
...
</form>
<强>解决方案强>
在许多情况下,使用<form action="">
足以使表单发布到脚本本身。否则,如果您知道脚本名为"bla.php"
,则设置action="bla.php"
。
答案 2 :(得分:1)
您在www.example.com/form.php上创建了一个表单。一年后,您忘记了URL只是抓取页面加载的任何URL。
在某些时候,假设您在框架中添加了“删除所有内容”全局选项,作为完全不同(略微奇怪)请求的一部分。
现在,有人发给您链接:www.example.com/form.php?delete_everything = true。由于您只是抓取该URL并将其设置为操作,现在就是您表单上的操作。哎呀。 XSS攻击基本上以这种方式工作。
始终假设您的代码将以您第一次编写时未曾预期的方式使用(即使是您,尤其是黑客)。
你如何绕过它?硬编码URL!您可以包含一个返回URL的函数。实际上,这就是像Symfony或CodeIgniter这样的框架如何解决它。
答案 3 :(得分:0)
不要忘记在整个脚本中将每次出现的“$ _SERVER ['PHP_SELF']”转换为“htmlentities($ _ SERVER ['PHP_SELF'])”。
如何避免PHP_SELF漏洞利用 http://www.html-form-guide.com/php-form/php-form-action-self.html
答案 4 :(得分:0)
我意识到这是一篇很老的文章,但这是我不久前也遇到的一个问题。我现在所要做的是:
$php_self = filter_input(INPUT_SERVER, 'PHP_SELF', 522);
define('PHP_SELF', $php_self);
这样,您可以安全地将常量PHP_SELF用作表单操作。此代码位的作用是通过过滤器运行超级全局$_SERVER['PHP_SELF']
,同时将结果分配为变量$php_self
。 ID号522指向FILTER_SANITIZE_FULL_SPECIAL_CHARS
,它使某人无法注入javascript等。
您可以在以下代码中查看哪些过滤器可用:
<table>
<tr><td>Filter Name</td><td>Filter ID</td></tr>
<?php
foreach(filter_list() as $id =>$filter)
{
echo '<tr><td>'.$filter.'</td><td>'.filter_id($filter).'</td></tr>'."n";
}
?>
</table>
即使不是全部的所有超全局$_SERVER
变量,也可以将相同的原理应用于大多数
以下是我最喜欢的一些游戏:
# FILTER_SANITIZE_STRING or _STRIPPED
$server_http_xrw = filter_input(INPUT_SERVER, 'HTTP_X_REQUESTED_WITH', 513);
# FULL_SPECIAL_CHARS
$server_request_method = filter_input(INPUT_SERVER, 'REQUEST_METHOD', 522);
$http_encoding = filter_input(INPUT_SERVER, 'HTTP_ACCEPT_ENCODING', 522);
因此,无论如何,通过利用PHP(现在)的内置过滤器,我们可以使用$_SERVER
变量而不必担心。
我希望这可以帮助那些徘徊在该主题中的人寻找答案。
答案 5 :(得分:-1)
不,因为任何人都可以更改链接的href
(使用像Firebug这样的工具)。当然,请确保您没有在该链接中放置任何敏感数据。
始终确保正确验证并解析接收的用户数据。