在表单和链接中使用$ _SERVER ['REQUEST_URI']或$ _SERVER ['PHP_SELF']的风险

时间:2013-01-29 14:43:55

标签: php

是否存在使用$_SERVER['REQUEST_URI']$_SERVER['PHP_SELF']作为表单中的操作或链接中的href的风险?

如果是这样,可以采取哪些措施来减轻风险呢?

6 个答案:

答案 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这样的工具)。当然,请确保您没有在该链接中放置任何敏感数据。

始终确保正确验证并解析接收的用户数据。