隐藏PHP';s X动力式割台

隐藏PHP';s X动力式割台,php,header,http-headers,Php,Header,Http Headers,我知道在PHP中,它会发送X-Powered-By头来获得PHP版本 我还知道,通过附加一些校验和,您可以访问PHP的积分和一些随机图像() 我还知道,在php.ini中,可以关闭expose\u php=off 但我在一些网站上做了一些事情,那就是使用 header('X-Powered-By: Alex'); 当我查看标题时,我可以看到它现在是“Alex”,而不是PHP版本。我的问题是,这会先发送上一个PHP头(在它到达我的头()之前),并且任何嗅探器程序都能检测到它吗?或者在发送回浏览器

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

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

我还知道,在php.ini中,可以关闭
expose\u php=off

但我在一些网站上做了一些事情,那就是使用

header('X-Powered-By: Alex');
当我查看标题时,我可以看到它现在是“Alex”,而不是PHP版本。我的问题是,这会先发送上一个PHP头(在它到达我的
头()
之前),并且任何嗅探器程序都能检测到它吗?或者在发送回浏览器之前,是由PHP“收集”头吗

顺便说一句,这并不是为了保密,只是好奇头在PHP中是如何工作的。

参见

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

X-Powered-By: PHP/5.1.2-1+b1…
让我们看看如何禁用它 为了防止PHP暴露 它安装在 服务器,通过将其签名添加到 我们需要在其中找到的web服务器头 php.ini变量
expose\u php
并将其关闭

默认情况下,
expose\u php
设置为On

在php.ini中(基于Linux 可在中找到此分发 很多地方,比如/etc/php.ini, /etc/php5/apache2/php.ini等) 找到包含
expose\u php的行
打开
并将其设置为关闭:

expose_php = Off
在进行此更改之后,PHP将不会 不再将其签名添加到web 服务器头。执行此操作将 让您的服务器更安全……这只会阻止远程主机 很容易看出您已经安装了PHP 在系统上,您是什么版本的 跑步

在发送回浏览器之前,PHP会“收集”标题,以便您可以覆盖状态标题等内容。测试方法是转到命令提示符,然后键入:

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

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

如果您不希望php.ini发送X-Powered-By标题,可以在php.ini中设置
expose\u php=Off

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


PHP也可以通过自己的复活节彩蛋检测到,您可以在这里阅读此主题:

在PHP中,只有在PHP遇到第一个输出语句时才会发送头

这包括第一个

我的问题是,这会先发送上一个PHP头(在它到达我的
头()
之前),并且任何嗅探器程序都能检测到它吗?或者在发送回浏览器之前,是由PHP“收集”头吗

不,它不会首先发送上一个PHP头。头在PHP中是发送的或不发送的(完整的,作为一个批处理)。默认情况下,您的调用会用相同的名称替换上一个头(除非您使用第二个参数指定了不同的内容)

注意:如果PHP不收集头,它将无法替换头

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

因此,是的,头是由PHP收集的,并在“真正的”输出开始时发送(HTTP响应体)


另请参见。

要在不访问php.ini的情况下删除X-Powered-By标题,只需添加一个空标题即可

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

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

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

回答您的问题:


只有X-Powered-By标头会被发送,因为它会被同名的标头替换。因此“嗅探器”无法检测到它。

查看HTTP响应标头的更简单方法是使用
curl-Ihttp://hostname/path
。为什么要使用GET请求而不是HEAD请求?@kylek,以防Heisenbug。理想情况下,您需要测试b其他。但这只是建议在php.ini中设置'expose_php=Off',alex在他的帖子中已经提到了这一点。它并没有删除标题,只是重置了它的值。为什么没有人建议呢?