我可以信任$ _SERVER ['SERVER_NAME']变量的内容吗?

时间:2012-02-02 18:41:54

标签: php security

我正在使用通配符子域为每个用户提供一个页面username.domain.com。

用户名本身在注册时已正确清理。

为简化本问题的目的,假设我有一个针对所有请求运行的PHP脚本。它使用...

获取域组件
$domain_components = explode( '.', $_SERVER['SERVER_NAME'] );

...然后弹出tld,主域和子域。

问题是,我是否需要将$_SERVER['SERVER_NAME']变量的内容,特别是域组件的内容视为具有潜在敌意?直观地说,我想不会因为PHP和Apache必须在我到达我的代码之前做得很好(并且this answer似乎确认它,因为变量在服务器控制之下),但我会我确信我不会忽视任何事情。

您是否通过$_SERVER['SERVER_NAME']知道任何已知的攻击?

(我使用的是PHP 5.3.9和Apache 2.2.3。)

3 个答案:

答案 0 :(得分:0)

我的理解是$_SERVER变量是由服务器构建的 - 因此外部浏览器不会影响其内容,除非您的服务器受到损害。如果是这种情况,$ _SERVER的内容是您最不担心的。

修改

除了那些采用$_SERVER['HTTP...]形式的

之外,我打算添加

答案 1 :(得分:0)

http://shiflett.org/blog/2006/mar/server-name-versus-http-host

似乎存在一些风险,但该帖子中有一些暗示,尽管它已经过时了。在查询中使用该变量(清理/转义!)来查找正确的用户并且如果可行的话接受它可能没有错。在此之后,您不再需要它,所以只使用您的内部数据。

答案 2 :(得分:-1)

您可以信任SERVER_NAME设置:

<VirtualHost *>
ServerName server.domain.com
ServerAlias server server2.domain.com server2
# ...
</VirtualHost>