【问题标题】:What alternative to HTTP_HOST can I use?我可以使用什么替代 HTTP_HOST?
【发布时间】:2012-06-16 13:05:09
【问题描述】:

我必须显示当前服务器主机(在 PHP 中,但这不是很重要)。我不知道我在哪个主机上。 我怎么能在没有安全问题的情况下做到这一点?如果我使用$_SERVER['HTTP_HOST'],它来自客户端,所以我不能相信这个信息(我认为它可以重写)。

PS:我已经阅读了这篇文章:How reliable is HTTP_HOST? 但我没有找到任何回复(也许我没有正确搜索...)

【问题讨论】:

  • 您希望将 HTTP_HOST 值用于什么用途?只是把它吐回到我们的屏幕上?将其插入数据库?用它创建链接?
  • 如果需要,您可以在 Apache 中对标头进行一些清理...
  • @georgefox:我想将它用于不同的目标:显示(在这种情况下我可以使用 JS)、生成永久链接、以文本形式与该主机发送邮件,甚至存储在数据库中等.

标签: php apache security host


【解决方案1】:

出于此目的使用$_SERVER['SERVER_NAME'],来自文档:

当前脚本在其下执行的服务器主机的名称。如果脚本在虚拟主机上运行,​​这将是为该虚拟主机定义的值。

【讨论】:

  • 好的,但是别名呢?它会起作用吗?如果我的服务器名称是“test.org”,并且我有一些别名,例如“test2.org”、“test3.org”,并且我的客户端登录到“test2.org”,则 $_SERVER['SERVER_NAME'] 将是“ test.org”? (我想要“test2.org”)
  • @rap-2-h test2.org 将通过,因为这是客户端请求的主机。
【解决方案2】:

如果您不打算将其用于安全或身份验证目的,那么$_SERVER['HTTP_HOST'] 应该没问题。您的脚本儿童访问者可能有不正确的值,但您的普通用户将使用行为良好的浏览器。

只要您像对待任何其他用户输入一样对待它,您就不会遇到任何安全问题。清理它,不要基于它构建文件名或执行命令,在显示它之前对其进行转义,等等。

【讨论】:

  • 好的,谢谢,我会考虑你的分析。我不构建文件名也不执行命令。我会重新考虑我想要实施的安全级别。
【解决方案3】:

你甚至可以给

php_uname('n');

甚至可能

`hostname -f`

(注意这里的反引号)尝试一下。

【讨论】:

  • 好的,谢谢!根据php.net/manual/fr/function.php-uname.php#105524:“您正在运行脚本的机器可能会提供许多不同的主机名,因此在构建 url 时不要使用它”,所以我不能在我的情况下使用它(我的服务器上有不同的主机)
  • 该死,我只是重新阅读了您的问题。在那种情况下,我猜只剩下 $_SERVER['SERVER_NAME'] 了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多