在表单的操作中或链接的href中使用$_SERVER['REQUEST_URI']
或$_SERVER['PHP_SELF']
是否存在风险?
如果存在风险,有什么方法可以减轻风险?
在表单的操作中或链接的href中使用$_SERVER['REQUEST_URI']
或$_SERVER['PHP_SELF']
是否存在风险?
如果存在风险,有什么方法可以减轻风险?
$_SERVER['PHP_SELF']
和$_SERVER['REQUEST_URI']
可以以一种方式被操纵,如果你没有适当地转义它,它就可以用于XSS攻击。这很大程度上是由于这样的URL可以正常工作的事实造成的:/path/to/index.php/" onmouseover="alert('hi')
让我们使用这段代码:
<form action="<?php echo $_SERVER['PHP_SELF']; ?>">
...
</form>
/path/to/index.php
,也就是SCRIPT_NAME
,但当你仅仅使用echo $_SERVER['PHP_SELF']
时,它会破坏你预期的HTML。<form action="/path/to/index.php/" onmouseover="alert('hi')">
...
</form>
解决方案
在许多情况下,使用<form action="">
就足以使表单提交到当前脚本。否则,如果你知道脚本的名称叫"bla.php"
,那么设置action="bla.php"
。
$_SERVER容易受到XSS攻击,使用前应该使用htmlspecialchars()进行清理。
以下是一个注入示例:
<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>"></form>
我知道这是一个相当古老的帖子,但这也是我一段时间以来一直在努力解决的问题。现在我所做的是:
$php_self = filter_input(INPUT_SERVER, 'PHP_SELF', 522);
define('PHP_SELF', $php_self);
通过这个方法,你可以安全地使用常量PHP_SELF作为表单操作。这段代码的作用是将超级全局变量 $_SERVER['PHP_SELF'] 通过过滤器运行,并将结果分配给变量 $php_self。编号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
变量而不必太担心。
我希望这能帮助那些寻找答案的人。
不要忘记在脚本中将每个出现的 "$_SERVER['PHP_SELF']" 转换为 "htmlentities($_SERVER['PHP_SELF'])"。
如何避免 PHP_SELF 攻击 http://www.html-form-guide.com/php-form/php-form-action-self.html
不,任何人都可以使用类似Firebug的工具更改链接的href
。当然,确保您不在该链接中放置任何敏感数据。
始终确保正确验证和解析您接收到的用户数据。
action="www.example.com/form.php?id=<?php echo htmlspecialchars($_GET['id']); ?>"
的操作。至于delete_everything=true
-这是一个非常简单的例子(拥有这样的参数的疯狂想法),但是想象一下只有管理员才能传递该参数-没有问题,对吧?但是有一天,有人向管理员发送了包含该参数的电子邮件,他有点匆忙,点击了URL,提交了表单... - Dan Blows$_SERVER['PHP_SELF']
值为www.nastysite.com/form.php
,那么htmlentities()
就无法保护您了。关于URL - 可以参考http://shiflett.org/blog/2005/feb/more-on-filtering-input-and-escaping-output#comment-7及其相关文章。 - Dan Blows