$_SERVER['HTTP_HOST']
用于站点上的所有链接而不必担心XSS攻击(即使以表格形式使用)是否“安全” ?
是的,它是安全的使用$_SERVER['HTTP_HOST']
,(甚至$_GET
和$_POST
)只要你确认他们接受他们。这是我为安全生产服务器所做的工作:
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
$reject_request = true;
if(array_key_exists('HTTP_HOST', $_SERVER)){
$host_name = $_SERVER['HTTP_HOST'];
// [ need to cater for `host:port` since some "buggy" SAPI(s) have been known to return the port too, see http://goo.gl/bFrbCO
$strpos = strpos($host_name, ':');
if($strpos !== false){
$host_name = substr($host_name, $strpos);
}
// ]
// [ for dynamic verification, replace this chunk with db/file/curl queries
$reject_request = !array_key_exists($host_name, array(
'a.com' => null,
'a.a.com' => null,
'b.com' => null,
'b.b.com' => null
));
// ]
}
if($reject_request){
// log errors
// display errors (optional)
exit;
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
echo 'Hello World!';
// ...
的优点$_SERVER['HTTP_HOST']
是它的行为比更加明确$_SERVER['SERVER_NAME']
。对比➫➫:
主机的内容:当前请求中的标头(如果有)。
与:
正在执行当前脚本的服务器主机的名称。
使用类似的更好定义的接口 $_SERVER['HTTP_HOST']
意味着更多的SAPI将使用可靠的明确定义的行为来实现它。(与另一个不同。)但是,它仍然完全依赖于 SAPI :
不能保证每个Web服务器都会提供这些[ $_SERVER
条目]中的任何一个;服务器可能会省略某些服务器,或提供此处未列出的其他服务器。
要了解如何正确检索主机名,首先,您需要了解仅包含代码的服务器无法知道网络上自己的名称(验证的前提)。它需要与提供自己名称的组件进行接口。这可以通过以下方式完成:
本地配置文件
本地数据库
硬编码的源代码
外部要求(卷曲)
客户/攻击者的Host:
请求
等等
通常,它是通过本地(SAPI)配置文件完成的。请注意,您已经正确配置了它,例如在Apache➫➫中:
为了使动态虚拟主机看起来像普通主机,需要“伪造”几件事。
最重要的是服务器名称,Apache使用该服务器名称来生成自引用URL等。它使用ServerName
指令进行配置,并且可以通过SERVER_NAME
环境变量供CGI使用。
运行时使用的实际值由 UseCanonicalName设置控制。
随着 UseCanonicalName Off
服务器的名字来自内容Host:
的请求头。有了 UseCanonicalName DNS
它来自虚拟主机的IP地址的反向DNS查找。前一种设置用于基于名称的动态虚拟托管,而后一种设置用于基于IP的**托管。
如果 Apache因为没有Host:
头而无法计算出服务器名称,或者DNS查找失败,那么将ServerName
使用配置的值代替。