如何在使用 Nginx 时隐藏 PHP 版本 8/7/5
默认情况下,客户端/用户/浏览器会看到有关您的 PHP 和 Web 服务器版本的信息。如果您忘记更新 PHP 版本,攻击者可以利用版本信息进行攻击或查找您的 PHP 版本中的漏洞。
教程详细信息 | |
---|---|
难度等级 | 简单的 |
Root 权限 | 是的 |
要求 | Linux 或 Unix 终端 |
类别 | Web 服务器 |
先决条件 | PHP 与 Nginx |
操作系统兼容性 | BSD • Linux • Unix |
预计阅读时间 | 4 分钟 |
如何使用 CLI 查找 PHP 版本
我们可以在服务器上检查 PHP 版本,输入:
这是我得到的结果:
$ php -v
$ php --version
PHP 8.1.12 (cli) (built: Oct 26 2022 10:00:44) (NTS) Copyright (c) The PHP Group Zend Engine v4.1.12, Copyright (c) Zend Technologies with Zend OPcache v8.1.12, Copyright (c), by Zend Technologies
接下来,您需要使用如下 curl 命令来显示远程服务器版本(包括 PHP 版本):
示例输出:
$ curl -IL https://some-server-ip-OR-domain-name/
$ curl -IL https://server1.example.com/
HTTP/2 200
server: nginx
date: Sun, 23 Jun 2019 20:48:48 GMT
content-type: text/html; charset=UTF-8
x-powered-by: PHP/8.1.12
expires: Thu, 19 Nov 1981 08:52:00 GMT
cache-control: no-store, no-cache, must-revalidate
pragma: no-cache
x-robots-tag: noindex, noarchive
strict-transport-security: max-age=15768000
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
x-xss-protection: 1; mode=block
x-whome: l-cbz01
referrer-policy: no-referrer-when-downgrade
隐藏您的 PHP 版本
您需要根据您的 Linux/Unix 版本和PHP 版本编辑/创建一个名为 custom.ini 的文件。请勿编辑 php.ini 文件,因为它可能会随您的 PHP 版本更新/替换。以下是简要列表:
- Alpine Linux 和 PHP v5.6.xx:/etc/php5/conf.d/custom.ini
- Alpine Linux 和 PHP v7.xx:/etc/php7/conf.d/custom.ini(对于 PHP 8.1.xx,编辑 /etc/php81/conf.d/custom.ini)
- Debian/Ubuntu Linux 和 PHP v7.xx:/etc/php/7.0/fpm/conf.d/custom.ini
- RHEL/Fedora/CentOS Linux:/etc/php.d/custom.ini
- OpenSUSE 或 SUSE Linux :/etc/php7/conf.d/custom.ini
您始终可以使用 php* 和grep 命令找到 php 目录位置:
示例输出(查找存储所有 .ini 文件的目录名称):
$ php -i | more
$ php -i | grep -i -A4 'Additional .ini files parsed'
$ php-fpm5 -i | grep -i -A4 'Additional .ini files parsed'
$ php-fpm7.0 -i | grep -i -A4 'Additional .ini files parsed'
$ php-fpm8.0 -i | grep -i -A4 'Additional .ini files parsed'
Configuration File (php.ini) Path => /etc/php/7.0/fpm Loaded Configuration File => /etc/php/7.0/fpm/php.ini Scan this dir for additional .ini files => /etc/php/7.0/fpm/conf.d Additional .ini files parsed => /etc/php/7.0/fpm/conf.d/10-mysqlnd.ini, /etc/php/7.0/fpm/conf.d/10-opcache.ini, /etc/php/7.0/fpm/conf.d/10-pdo.ini,
根据您的设置,将以下行添加到 custom.ini:
############################################## ## this is for Alpine Linux and PHP v5.6.xx ## ############################################## echo 'expose_php = off' >> /etc/php5/conf.d/custom.ini
对于 Alpine Linux 和 PHP 7.x:
echo 'expose_php = off' >> /etc/php7/conf.d/custom.ini
重新启动/重新加载 PHP
语法取决于你的 PHP 版本:
### [ Alpine linux restart php-fpm ] ##
$ sudo /etc/init.d/php-fpm restart
### [ RHEL/CentOS 5.x/6.x restart php-fpm ] ##
$ sudo service php-fpm restart
### [ RHEL/CentOS 7.x restart php-fpm ] ##
$ sudo systemctl restart php-fpm
### [ Debian/Ubuntu Linux latest restart php-fpm ] ##
$ sudo service php7.0-fpm restart
### [ FreeBSD restart php-fpm ] ##
$ sudo service php-fpm restart
### [ Alpine Linux restart php-fpm7/php-fpm81 ] ##
$ sudo /etc/init.d/php-fpm7 restart
$ sudo /etc/init.d/php-fpm81 restart
### [ SUSE/OpenSUSE Linux restart php-fpm7 ] ##
$ sudo systemctl restart php-fpm.service
确认
再次使用 curl 命令:
示例输出:
$ curl -IL https://some-server-ip-OR-domain-name/
$ curl -IL https://server1.example.com/
HTTP/2 200 server: nginx date: Sun, 23 Jun 2019 20:56:01 GMT content-type: text/html; charset=UTF-8 set-cookie: PHPSESSID=q49sd1armm17j7a8l658538n74; path=/ expires: Thu, 19 Nov 1981 08:52:00 GMT cache-control: no-store, no-cache, must-revalidate pragma: no-cache x-robots-tag: noindex, noarchive strict-transport-security: max-age=15768000 x-content-type-options: nosniff x-frame-options: SAMEORIGIN x-xss-protection: 1; mode=block x-whome: l-cbz01 referrer-policy: no-referrer-when-downgrade
您还可以使用nmap 命令,如下所示:
示例输出:
$ sudo nmap -sV --script=http-php-version server-ip-here
$ sudo nmap -sV --script=http-php-version server1.example.com
[sudo] password for vivek: Starting Nmap 7.70 ( https://nmap.org ) at 2019-06-24 02:26 IST Nmap scan report for newsletter.example.com (96.126.119.5) Host is up (0.26s latency). rDNS record for 96.126.119.5: nb-96-126-119-5.dallas.nodebalancer.linode.com Not shown: 998 closed ports PORT STATE SERVICE VERSION 80/tcp open http nginx |_http-server-header: nginx 443/tcp open ssl/http nginx |_http-server-header: nginx Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . Nmap done: 1 IP address (1 host up) scanned in 21.20 seconds
关于隐藏 PHP 版本的警告
这种技术属于“通过隐蔽性实现安全”的范畴。即使组织外部没有人允许了解有关 PHP 版本的任何信息,攻击者仍然可以使用指纹识别等其他方法猜测或找到您的 PHP 版本。我强烈建议您及时应用 PHP/Nginx/Apache 补丁并编写安全代码。根据您的 Linux/Unix 版本,更新 PHP 非常简单:
在 Ubuntu/Debian Linux 上更新 PHP 和其他应用程序
输入以下apt 命令/ apt-get 命令:
$ sudo apt update
$ sudo apt upgrade
在 RHEL/CentOS/Fedora Linux 上更新 PHP 和其他应用程序
输入以下yum 命令:
$ sudo yum update
在 Alpine Linux 上更新 PHP 和其他应用程序
输入以下apk 命令:
# apk update && apk upgrade