我做了很多搜索,还阅读了 PHP $_SERVER 文档。我是否有权在我的 PHP 脚本中使用整个站点中使用的简单链接定义?
$_SERVER['SERVER_NAME']基于您的 Web 服务器的配置文件(在我的例子中是 Apache2),并且取决于几个指令:(1)VirtualHost,(2)ServerName,(3)UseCanonicalName 等。
$_SERVER['SERVER_NAME']
$_SERVER['HTTP_HOST']是根据客户的要求。
$_SERVER['HTTP_HOST']
因此,在我看来,为了使我的脚本尽可能兼容而使用的正确方法是$_SERVER['HTTP_HOST']. 这个假设正确吗?
后续评论:
$_SERVER我想在阅读这篇文章并注意到有些人说“他们不会信任任何vars”后,我有点偏执:
$_SERVER
http://markjaquith.wordpress.com/2009/09/21/php-server-vars-not-safe-in-forms-or-links/
http://php.net/manual/en/reserved.variables.server.php#89567(评论:Vladimir Kornea 14-Mar-2009 01:06)
显然,讨论主要是关于$_SERVER['PHP_SELF']为什么你不应该在没有适当转义以防止 XSS 攻击的情况下在表单操作属性中使用它。
$_SERVER['PHP_SELF']
我对上述原始问题的结论是,使用$_SERVER['HTTP_HOST']网站上的所有链接是“安全的”,而不必担心 XSS 攻击,即使在表单中使用也是如此。
如果我错了,请纠正我。
这可能是每个人首先想到的。但这有点困难。请参阅Chris Shiflett 的文章 SERVER_NAME VersusHTTP_HOST。
SERVER_NAME
HTTP_HOST
似乎没有银弹。只有当您强制 Apache 使用规范名称时,您才能始终使用SERVER_NAME.
因此,您要么使用它,要么根据白名单检查主机名:
$allowed_hosts = array('foo.example.com', 'bar.example.com'); if (!isset($_SERVER['HTTP_HOST']) || !in_array($_SERVER['HTTP_HOST'], $allowed_hosts)) { header($_SERVER['SERVER_PROTOCOL'].' 400 Bad Request'); exit; }