PHP.INI 设置禁用 exec、shell_exec、system、popen 和其他函数以提高安全性
教程详细信息 | |
---|---|
难度等级 | 简单的 |
Root 权限 | 是的 |
要求 | Linux 或 Unix 终端 |
类别 | Web 服务器 |
先决条件 | 灯 |
操作系统兼容性 | BSD • Linux • Unix |
预计阅读时间 | 3 分钟 |
我的示例 php.ini
警告!当您在 php.ini 中阻止函数时,某些基于 PHP 的应用程序可能无法运行。请参阅下面的故障排除部分。我在PHP 版本5.x/6.x/7.x/8.x 上测试了这些设置。
PHP.INI 设置禁用 exec、shell_exec、system、popen 和其他函数以提高安全性
打开终端应用程序或使用 ssh 命令通过 ssh 会话登录到您的服务器。使用文本编辑器(如 vim 命令或 nano 命令)打开 php.ini 文件:
$ sudo vi /etc/php.ini
或者
$ sudo nano /etc/php.ini
找到 disable_functions 并按如下方式设置新列表:
# list of function to disable globally # disable_functions =exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source
出于安全原因,我还建议禁用 allow_url_include 和 allow_url_fopen:
allow_url_fopen=Off allow_url_include=Off
保存并关闭文件。通过输入以下命令重新启动 httpd 服务器:
# service httpd restart
或者,如果您使用的是 Debian/Ubuntu Linux,请运行:
# service apache2 restart
关于基于 systemd 的系统的说明
如果您使用的是基于 systemd + RHEL/CentOS/Fedora Linux 的系统,请输入:
# systemctl httpd restart
如果您使用的是基于 systemd + Debian/Ubuntu Linux 的系统,请输入:
# systemctl restart apache2
关于 Debian/Ubuntu/CentOS Linux 下的 PHP-fpm 的说明
在 /etc/php/7.0/fpm/conf.d/ 目录中创建一个名为 security.ini 的文件:
$ vi sudo /etc/php/7.0/fpm/conf.d/99-security.ini
附加以下设置:
# disable functions disable_functions=exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source
使用 vim 文本编辑器保存并关闭文件。接下来需要重新启动 php-fpm/php7.0-fpm/php5.0-fpm 服务,运行:
$ sudo systemctl restart php-fpm # <- CentOS/RHEL 7.x
$ sudo systemctl restart php7.0-fpm.service # <- Ubuntu/Debian
禁用功能时解决 php.ini 设置问题
开发人员和系统管理员可以配置 PHP 将所有错误记录到日志文件中,以获取用于故障排除的详细信息。我在 php.in 文件中放入了以下配置指令行:
error_log = /var/log/nginx/php-scripts.log display_errors = Off
然后,使用 php-fpm 时,按照您的 Linux/Unix 发行版版本,按如下方式重新加载或重新启动 php-fpm 5/6/7/8 服务
$ sudo systemctl restart php-fpm
:
对于 mod_php,按照您的 Linux/Unix 发行版版本,按如下方式重新启动/重新加载 Apache 服务器
$ sudo service apache2 restart
:
最后使用grep / egrep 命令或 tail 命令查看日志。例如:
$ sudo tail -f /var/log/nginx/php-scripts.log
总结
有很多方法可以保护基于 PHP 的应用程序。有时您可以在 php.ini 设置中阻止危险函数。但是,必须小心,因为它可能会破坏应用程序。当然,阻止 PHP 函数只是其中的一部分。它不能替代用 PHP 编写安全代码。
参见:
- Linux:系统管理员的 25 个 PHP 安全最佳实践– 配置错误的服务器端脚本语言可能会引发各种问题。因此,应谨慎使用 PHP。以下是系统管理员安全配置 PHP 的 25 个 PHP 安全最佳实践。