English 中文(简体)
隐藏PHP的X-Powered-By头
原标题:Hiding PHP s X-Powered-By header

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

我也知道,通过添加一些校验和,你可以访问PHP的信誉,以及一些随机图像(更多信息请点击此处)。

我也知道在php.ini中可以设置expose_php = off

但这里是我在几个地点做的,正在使用。

header( X-Powered-By: Alex );

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

顺便提一下,这不是通过混淆来保护安全,只是好奇 PHP 中标头的工作方式。

最佳回答

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

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

这也是为什么如果您尝试在输出后使用setcookie,它会发送警告的原因:

Warning: Cannot modify header information - headers already sent by (output started at /path/to/php/file.php:100) in /path/to/php/file.php on line 150

请注意,如果使用了输出缓冲,则此内容无效,因为输出将不会发送,直到运行适当的输出缓冲命令为止。

问题回答

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

PHP 首先编译所有内容(包括哪些标题具有哪些值),然后开始输出,不是反过来。

PHP还有自己的复活节彩蛋,您可以在这里阅读有关此主题的内容:PHP复活节彩蛋

参见Apache 技巧:隐藏 PHP 版本(X-Powered-By)

Ups… As we can see PHP adds its own banner:

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

Let’s see how we can disable it. In order to prevent PHP from exposing the fact that it is installed on the server, by adding its signature to the web server header we need to locate in php.ini the variable expose_php and turn it off.

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

In your php.ini (based on your Linux distribution this can be found in various places, like /etc/php.ini, /etc/php5/apache2/php.ini, etc.) locate the line containing expose_php On and set it to Off:

expose_php = Off

After making this change PHP will no longer add it’s signature to the web server header. Doing this, will not make your server more secure… it will just prevent remote hosts to easily see that you have PHP installed on the system and what version you are running.

如果您正在使用共享托管,则要隐藏 X-Powered-By: PHP/7.x.x,请将以下代码添加到.htaccess文件中。

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

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

标题被 PHP "收集"后再发送回浏览器,这样您可以覆盖状态标题之类的内容。测试方法是转到命令提示符,然后键入:

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

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

如果没有访问php.ini就要去掉X-Powered-By标头,只需添加一个空标头即可。

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

这将覆盖默认的 X-Powered-By 标头,用一个空值替换它。大多数客户端和应用程序似乎不发送此标头。

如之前所指出的,必须在输出之前将其插入到代码中。

回答你的问题:

只有您的X-Powered-By标头将被发送,因为它将被具有相同名称的标头替换。因此,它无法被嗅探器检测到。

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

不是,它不会首先发送之前的PHP头文件。在PHP中,头文件要么被发送,要么不被发送(作为一个完整的批次)。默认情况下,您的

调用会使用相同名称替换先前的头文件(除非您使用第二个参数指定了其他内容)。

注意:如果PHP不收集头文件,它将无法替换其中之一。

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

是的,头信息被 PHP 收集,并且在“真正的”输出开始时发送(HTTP 响应正文)。

也可以查看headers_sent文档

PHP 有一种内置函数可以移除头部信息:header_remove()

要删除X-Powered-By头,您可以使用:

<?php

header_remove(
    name:  X-Powered-By 
);

正如您所看到的,您只需将标头名称作为字符串参数传递,就完成了。

请注意,name 参数不区分大小写地解析,因此您可以使用 x-powered-by 进行调用。


自PHP8.0.0起,在不带name参数调用该函数时,所有先前设置的标头都将被取消设置。





相关问题
Brute-force/DoS prevention in PHP [closed]

I am trying to write a script to prevent brute-force login attempts in a website I m building. The logic goes something like this: User sends login information. Check if username and password is ...

please can anyone check this while loop and if condition

<?php $con=mysql_connect("localhost","mts","mts"); if(!con) { die( unable to connect . mysql_error()); } mysql_select_db("mts",$con); /* date_default_timezone_set ("Asia/Calcutta"); $date = ...

定值美元

如何确认来自正确来源的数字。

Generating a drop down list of timezones with PHP

Most sites need some way to show the dates on the site in the users preferred timezone. Below are two lists that I found and then one method using the built in PHP DateTime class in PHP 5. I need ...

Text as watermarking in PHP

I want to create text as a watermark for an image. the water mark should have the following properties front: Impact color: white opacity: 31% Font style: regular, bold Bevel and Emboss size: 30 ...

How does php cast boolean variables?

How does php cast boolean variables? I was trying to save a boolean value to an array: $result["Users"]["is_login"] = true; but when I use debug the is_login value is blank. and when I do ...

热门标签