【问题标题】:Can $_SERVER['SERVER_NAME'] be forged/faked?$_SERVER['SERVER_NAME'] 可以伪造/伪造吗?
【发布时间】:2012-07-08 10:45:45
【问题描述】:

PHP 变量 $_SERVER['SERVER_NAME'] 可以伪造或伪造吗?我正计划将其用作表单发布的安全措施。我会检查以确保该变量是我的站点名称(www.example.com)。我知道 HTTP_REFERRER 可以伪造,但我不确定这个。

谢谢!

【问题讨论】:

  • 无论如何它总是一样的......你的服务器。不是请求来自的服务器。

标签: php http-referer server-name


【解决方案1】:

实际上 $_SERVER['SERVER_NAME'] 可能会受到客户端浏览器发送的内容的影响...请参阅http://shiflett.org/blog/2006/mar/server-name-versus-http-host 以了解有关该问题的全面调查。

【讨论】:

  • 感谢您提供此博文的链接。但是,它提到了在 apache 网络服务器“配置错误”的情况下通过发送 HTTP_HOST 标头来影响 SERVER_NAME 的可能性。如果 Web 服务器配置正确/安全,您是否知道任何其他影响此值的方法?
  • 我不知道,但问题是,Apache 中的设置默认设置为不安全(httpd.apache.org/docs/2.4/mod/core.html#usecanonicalname),所以我猜很多人不会意识到他们需要更改该值使其安全。
【解决方案2】:

通常不能被访客伪造。但我怀疑您可能希望强制使用某个 SERVER_NAME 来许可脚本,以便它们只能由特定域使用。在这种情况下,答案是肯定的,这个变量肯定可以伪造

原因很简单,服务器设置了这个值。在大多数情况下,您会将 PHP 作为 Apache 模块运行,但有时您有其他 Apache 模块,有时您使用 NGINX 或 IIS 在 CGI 模式下运行 PHP,有时您甚至将 PHP 作为 CLI 运行为自定义的子进程- 构建部署在云中的服务器。这些服务器将负责设置该变量。

另外,总是有手动分配。

 $_SERVER['SERVER_NAME'] = ... // this can go above all your scripts

【讨论】:

    【解决方案3】:

    它不能被伪造,persay,但它会总是返回您的网站名称。如果您使用同一个脚本运行多个站点,例如,根据提供的主机名使用不同的数据库,这将非常有用。

    PHP documentation 说:

    'SERVER_NAME'
        The name of the server host under which the current script is executing. If the script is running on a virtual host, this will be the value defined for that virtual host. 
    

    【讨论】:

    • 您将SERVER_NAMEHTTP_HOST 混淆了。