PHP 7.4 是一个非常强大的编程语言,但出于安全考虑,合理配置 PHP 是至关重要的,尤其是在生产环境中。禁用一些常见的危险函数,可以有效防止许多攻击,保护应用程序免受恶意操作。
下面是关于 PHP 7.4 安全配置最佳实践,特别是 禁用危险函数 的详细指导。
目录
- 概述
- 禁用危险函数
- 其他安全配置最佳实践
- 配置文件示例
- 常见问题与解决方案
1. 概述
PHP 提供了一些强大的函数,但有些函数由于其危险性(如允许执行系统命令、读取敏感信息或访问文件系统)可能被恶意用户滥用。这些危险函数通常会导致远程代码执行(RCE)攻击、文件包含漏洞等严重安全问题。
禁用这些函数是 PHP 安全配置的重要一步,特别是在面对生产环境时。
2. 禁用危险函数
在 PHP 7.4 中,以下是一些常见的 危险函数,通常建议禁用:
1. exec()
、shell_exec()
、system()
、passthru()
这些函数允许执行系统命令,攻击者如果能够注入恶意命令,将会控制服务器的操作。
2. eval()
该函数允许执行 PHP 代码字符串,是一个常见的注入攻击入口。恶意用户可能通过输入恶意 PHP 代码进行执行。
3. base64_decode()
(与 eval()
配合使用时尤其危险)
如果攻击者可以将恶意代码通过 base64 编码后提交,eval()
解码后执行可能导致远程代码执行。
4. file_get_contents()
、fopen()
、readfile()
、file()
这些文件操作函数如果不加以限制,可能被用于访问敏感文件,甚至远程文件。
5. popen()
、proc_open()
这两个函数允许打开进程并与之交互,如果被恶意用户利用,将导致严重的安全隐患。
6. register_shutdown_function()
如果没有适当的验证,它也可能成为远程执行代码的入口点。
7. assert()
此函数在开发中通常用于调试,但它也有执行代码的能力。攻击者可以利用它执行恶意代码。
8. ini_set()
允许运行时更改 PHP 配置,这可能被用来绕过安全限制。
3. 禁用函数的配置方法
在 php.ini
中,使用 disable_functions
指令来禁用这些函数。通过在 php.ini
中设置禁用的函数,你可以有效防止恶意调用。
禁用危险函数
- 打开
php.ini
文件。文件的位置通常在以下路径:- Linux:
/etc/php/7.4/apache2/php.ini
或/etc/php/7.4/cli/php.ini
- Windows:
C:\xampp\php\php.ini
或C:\php\php.ini
- Linux:
- 找到
disable_functions
配置项,并将危险函数列入其中。例如:disable_functions = exec,shell_exec,system,Passthru,popen,proc_open,eval,assert,base64_decode,ini_set,file_get_contents,fopen,readfile,file
这将禁用常见的危险函数,包括:
exec()
shell_exec()
system()
passthru()
popen()
proc_open()
eval()
assert()
base64_decode()
(因为它可以与eval()
配合使用)file_get_contents()
fopen()
readfile()
file()
- 保存并关闭
php.ini
文件。 - 重启 Web 服务器:
- Apache:
sudo systemctl restart apache2
- Nginx + PHP-FPM:
sudo systemctl restart php7.4-fpm sudo systemctl restart nginx
- Apache:
- 验证禁用:
你可以使用phpinfo()
来检查禁用的函数是否生效。创建一个phpinfo.php
文件,内容如下:<?php phpinfo(); ?>
访问该文件,并搜索
disable_functions
字段,查看禁用的函数列表。
4. 其他安全配置最佳实践
除了禁用危险函数外,还有一些其他的重要安全配置,帮助确保 PHP 运行时的安全性。
1. 开启 open_basedir
限制
限制 PHP 脚本访问的目录范围,可以防止恶意脚本访问不应访问的文件。
open_basedir = /var/www:/tmp
这将限制 PHP 只能访问 /var/www
和 /tmp
目录中的文件。
2. 禁用 allow_url_fopen
和 allow_url_include
禁用这些选项可以防止远程文件包含攻击。
allow_url_fopen = Off
allow_url_include = Off
3. 禁止显示错误
在生产环境中禁用错误显示,以防止攻击者通过错误信息获取系统细节。
display_errors = Off
log_errors = On
error_log = /var/log/php_errors.log
4. 启用严格的 session 配置
增强 session 安全性:
session.cookie_httponly = 1
session.cookie_secure = 1 # 如果使用 HTTPS
session.use_only_cookies = 1
session.cookie_samesite = Strict
5. 启用 disable_functions
的常见应用程序限制
- 禁用
ini_set
、putenv
、proc_open
等不必要的函数,防止配置篡改或绕过安全设置。 - 设置合适的
max_execution_time
、memory_limit
等配置,限制 PHP 程序的最大运行时间和内存使用量,防止资源耗尽攻击。
5. 配置文件示例
以下是一个包含安全配置的 php.ini
示例:
; 禁用危险函数
disable_functions = exec,shell_exec,system,Passthru,popen,proc_open,eval,assert,base64_decode,ini_set,file_get_contents,fopen,readfile,file
; 设置open_basedir限制
open_basedir = /var/www:/tmp
; 禁用远程文件包含
allow_url_fopen = Off
allow_url_include = Off
; 错误显示
display_errors = Off
log_errors = On
error_log = /var/log/php_errors.log
; 增强 session 安全性
session.cookie_httponly = 1
session.cookie_secure = 1 ; 仅适用于 HTTPS
session.use_only_cookies = 1
session.cookie_samesite = Strict
; 设置内存限制与执行时间
memory_limit = 128M
max_execution_time = 30
6. 常见问题与解决方案
1. 禁用函数导致某些功能无法使用
某些功能可能依赖于禁用的函数,通常是在某些特定应用程序中。解决方案是:
- 重新审视是否可以安全地使用这些功能。
- 如果确实需要,考虑使用更安全的替代方法,或将其移至受限环境中。
2. 如何确保禁用的函数无法绕过
即使禁用函数,某些用户仍可能通过其他手段绕过(例如使用 php.ini
覆盖)。为此,定期检查日志并在开发环境中进行严格的安全审计。
总结
在 PHP 7.4 中禁用危险函数是增强 PHP 安全性的一个重要步骤。配合其他安全配置,如禁用远程文件包含、限制 open_basedir
、增强 session 安全性等,可以显著提升应用程序的安全性。始终记得,安全是一个持续的过程,需要不断更新、审查和加强。