PHP 7.4 是一个非常强大的编程语言,但出于安全考虑,合理配置 PHP 是至关重要的,尤其是在生产环境中。禁用一些常见的危险函数,可以有效防止许多攻击,保护应用程序免受恶意操作。

下面是关于 PHP 7.4 安全配置最佳实践,特别是 禁用危险函数 的详细指导。

目录

  1. 概述
  2. 禁用危险函数
  3. 其他安全配置最佳实践
  4. 配置文件示例
  5. 常见问题与解决方案

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 中设置禁用的函数,你可以有效防止恶意调用。

禁用危险函数

  1. 打开 php.ini 文件。文件的位置通常在以下路径:
    • Linux:/etc/php/7.4/apache2/php.ini/etc/php/7.4/cli/php.ini
    • Windows:C:\xampp\php\php.iniC:\php\php.ini
  2. 找到 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()
  3. 保存并关闭 php.ini 文件。
  4. 重启 Web 服务器:
    • Apache:
      sudo systemctl restart apache2
      
    • Nginx + PHP-FPM:
      sudo systemctl restart php7.4-fpm
      sudo systemctl restart nginx
      
  5. 验证禁用
    你可以使用 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_fopenallow_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_setputenvproc_open 等不必要的函数,防止配置篡改或绕过安全设置。
  • 设置合适的 max_execution_timememory_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 安全性等,可以显著提升应用程序的安全性。始终记得,安全是一个持续的过程,需要不断更新、审查和加强。