【问题标题】:Hiding PHP's X-Powered-By header隐藏 PHP 的 X-Powered-By 标头
【发布时间】:2011-01-20 02:25:18
【问题描述】:

我知道在 PHP 中,它会发送 X-Powered-By 标头来获取 PHP 版本。

我还知道,通过附加一些校验和,您可以访问 PHP 的积分,以及一些随机图像 (more info here)。

我也知道在php.ini你可以转expose_php = off

但这是我在几个网站上做过的事情,那就是使用

header('X-Powered-By: Alex');

当我查看标题时,我可以看到它现在是“Alex”而不是 PHP 版本。我的问题是,这是否会首先发送前一个 PHP 标头(在它到达我的header() 之前,它是否可以被任何嗅探器程序检测到?或者是标头被 PHP '收集',被发回之前到浏览器?

顺便说一句,这不是为了安全起见,只是好奇标头在 PHP 中是如何工作的。

【问题讨论】:

标签: php header http-headers


【解决方案1】:

如果您不希望它发送 X-Powered-By 标头,您可以在 php.ini 中设置 expose_php = Off

PHP 首先编译所有内容(包括哪些标头具有哪些值)然后开始输出,反之亦然。

PHP 也可以通过自己的复活节彩蛋检测到,您可以在此处阅读有关此主题的信息:PHP Easter Eggs

【讨论】:

    【解决方案2】:

    Apache Tips & Tricks: Hide PHP version (X-Powered-By)

    Ups... 我们可以看到 PHP 添加了自己的 横幅:

    X-Powered-By: PHP/5.1.2-1+b1…
    

    让我们看看如何禁用它。在 为了防止 PHP 暴露 事实上,它安装在 服务器,通过将其签名添加到 我们需要定位的网络服务器标头 php.ini 变量expose_php 并将其转为off

    默认情况下expose_php 设置为开启。

    在您的 php.ini 中(基于您的 Linux 分布这可以在 各个地方,例如 /etc/php.ini, /etc/php5/apache2/php.ini 等) 找到包含expose_php On 的行并将其设置为关闭:

    expose_php = Off
    

    进行此更改后,PHP 将不会 再把它的签名添加到网络上 服务器标头。这样做,会 不会让您的服务器更安全……它只会阻止远程主机 很容易看到你已经安装了 PHP 在系统上,你是什么版本 正在运行。

    【讨论】:

    • 但这只是建议在 php.ini 中设置“expose_php = Off”,正如 alex 在他的帖子中已经提到的那样。
    【解决方案3】:

    在 PHP 中,直到 PHP 遇到它的第一个输出语句时才会发送标头。

    这包括第一个 <?php 之前的任何内容。

    这也是为什么 setcookie 如果您在输出某些内容后尝试使用它会引发警告:

    警告:无法修改标题 信息 - 已发送的标头 (输出开始于 /path/to/php/file.php:100) 在 /path/to/php/file.php 第 150 行

    请注意,如果 output buffering 正在使用,则这些都不适用,因为在运行适当的输出缓冲命令之前不会发送输出。

    【讨论】:

      【解决方案4】:

      标头在发送回浏览器之前由 PHP “收集”,因此您可以覆盖状态标头之类的内容。测试它的方法是转到命令提示符,然后键入:

      telnet www.yoursite.com 80
      GET /index.php HTTP/1.1
      [ENTER]
      [ENTER]
      

      您会看到响应中发送的标头(将 /index.php 替换为域后 PHP 页面的 URL。)

      【讨论】:

      • 查看 HTTP 响应标头的更简单方法是使用 curl -I http://hostname/path
      • 为什么使用 GET 请求而不是 HEAD 请求?
      • @kylek,如果是 Heisenbugs。理想情况下,您希望同时测试两者。
      【解决方案5】:

      要在不访问 php.ini 的情况下摆脱 X-Powered-By 标头,只需添加一个空标头即可。

      <?php header('X-Powered-By:'); ?>
      

      这会用空值覆盖默认的 X-Powered-By 标头,尽管大多数客户端和应用程序的行为就像根本没有发送此标头一样。

      如前所述,这必须在发送任何输出之前插入到代码中。

      回答你的问题:

      只会发送您的 X-Powered-By 标头,因为它会被您的同名标头替换。所以它不能被“嗅探器”检测到。

      【讨论】:

      • 它不会删除标题,而只是重置其值。
      【解决方案6】:

      我的问题是,这是否会首先发送前一个 PHP 标头(在它到达我的header() 之前,它是否可以被任何嗅探器程序检测到?或者是标头在被发送回浏览器之前被 PHP '收集'?

      不,它不会先发送前一个 PHP 标头。标头在 PHP 中发送或不发送(完整,作为一批)。默认情况下,您的 headerDocs 调用会替换以前的同名标头(除非您使用第二个参数指定不同的内容)。

      注意:如果 PHP 不收集标头,则无法替换。

      由于它没有提前发送,因此无法使用嗅探器程序检测到。

      所以是的,标头由 PHP 收集并在“真实”输出开始时发送(HTTP 响应正文)。

      另见headers_sentDocs

      【讨论】:

        【解决方案7】:

        要隐藏 X-Powered-By: PHP/7.x.x ,如果您使用的是共享主机,请在 .htaccess 文件中添加以下代码

        Header always unset X-Powered-By
        Header unset X-Powered-By
        

        然后重新加载浏览器或使用LiteSpeed缓存插件清除缓存:https://en.wordpress.org/plugins/litespeed-cache/

        【讨论】:

          猜你喜欢
          • 2013-12-28
          • 1970-01-01
          • 1970-01-01
          • 2021-05-06
          • 1970-01-01
          • 1970-01-01
          • 2012-01-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多