隐藏PHP的X-Powered-By头

我知道在PHP中,它发送的X-Powered-By头具有PHP版本。

我也知道通过追加一些校验和,你可以访问PHP的学分,和一些随机图像( 更多信息在这里 )。

我也知道在php.ini中可以打开expose_php = off

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

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

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

顺便说一句,这不是由于默默无闻的安全性,只是好奇头是如何工作在PHP中。

在PHP中,在PHP遇到第一个输出语句之前,不会发送头文件。

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

这也是为什么setcookie发送一个警告,如果你尝试使用它之后已经输出:

警告:不能修改标题信息 – 已在(path150 /path/to/php/file.php:100上的/path/to/php/file.php:100开始输出)发送的标题

请注意,如果正在使用输出缓冲 ,则不适用这种情况,因为只有运行了适当的输出缓冲命令后才会发送输出。

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

PHP首先编译所有东西(包括哪些头文件具有哪些值),然后启动输出,反之亦然。

PHP也可以用自己的复活节彩蛋检测到,你可以在这里阅读这个主题: PHP复活节彩蛋

查看Apache提示和技巧:隐藏PHP版本(X-Powered-By)

Ups …正如我们可以看到PHP添加自己的旗帜:

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

让我们看看我们如何可以禁用它。 为了防止PHP暴露它安装在服务器上的事实,通过将其签名添加到Web服务器头部,我们需要在php.ini中findvariablesexpose_php并将其off

默认情况下, expose_php被设置为On。

在你的php.ini文件中(基于你的Linux发行版,可以在不同的地方find,比如/etc/php.ini,/etc/php5/apache2/php.ini等),find包含expose_php On的行并设置它closures:

 expose_php = Off 

在做这个改变之后,PHP将不再将其签名添加到Web服务器头部。 这样做, 不会使你的服务器更加安全……它将阻止远程主机轻松地看到你已经在系统上安装了PHP以及你正在运行的是哪个版本。

头部被PHP“收集”,然后再发送回浏览器,这样就可以覆盖状态头部等内容。 testing它的方法是转到命令提示符,然后键入:

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

你会看到在响应中发送的头文件(将/index.phpreplace为你的PHP页面的URL后面的域名)。

为了摆脱X-Powered-By标题而无需访问php.ini,只需添加一个空头。

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

这将用空值覆盖默认的X-Powered-By头部,尽pipe大多数客户端和应用程序像这个头部根本不被发送。

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

并回答你的问题:

只有您的X-Powered-By标题将被发送,因为它被replace为具有相同名称的标题。 所以它不能被“嗅探器”检测到。

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

不,它不会先发送先前的PHP标头。 头文件在PHP中被发送或者没有被发送(完整地,作为一个批处理)。 默认情况下,您的header Docs调用将使用相同的名称replace以前的头(除非您指定与第二个参数不同的内容)。

注意:如果PHP不收集标题,它将无法取代一个。

由于它不能提前发送,因此无法通过嗅探程序检测到。

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

另请参阅headers_sent 文档