隐藏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中findvariables
expose_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
文档 。