必须禁用exec、system等危险函数并设置open_basedir与web目录执行权限,否则攻击者可执行系统命令或写入webshell;需通过php --ini确认真实配置路径,在fpm pool中精确配置disable_functions和open_basedir,并重启php-fpm验证cli与web双端生效。

PHP项目上线前必须禁用危险函数并设置严格目录权限,否则攻击者可利用exec、system等函数直接执行系统命令,或通过file_put_contents写入Webshell,导致服务器完全失守。这不是可选项,而是强制安全基线。
确认真实生效的php.ini路径
别猜路径,让PHP自己告诉你它正在读哪个配置文件:运行php --ini,重点看“Loaded Configuration File”这一行输出的路径——这才是Web请求实际加载的文件。CLI环境和Web环境加载的php.ini完全不同,改错位置等于没改。
【必须区分清楚】 Apache模块通常用/etc/php/{版本}/apache2/php.ini,PHP-FPM则优先读/etc/php/{版本}/fpm/php.ini或/etc/php/{版本}/fpm/pool.d/www.conf里的php_admin_value[disable_functions],后者优先级更高,会覆盖php.ini中的设置。
禁用高危函数(FPM环境推荐方法)
在PHP-FPM多应用部署中,直接修改pool配置最稳妥,避免全局影响其他站点:
第一步:进入FPM池配置目录,例如cd /etc/php/8.5/fpm/pool.d
第二步:编辑对应站点的pool文件(如www.conf),在[www]段落下方添加一行:php_admin_value[disable_functions] = exec,passthru,shell_exec,system,proc_open,popen,pcntl_exec,pcntl_fork,eval,assert,file_put_contents,symlink,copy,chmod,chown,chgrp,ini_set,dl
第三步:保存后执行sudo systemctl restart php8.5-fpm——注意是restart,不是reload,否则配置不会重载。
这一步必须全小写、逗号后不能有空格、末尾不能加逗号,否则整行失效,PHP会静默丢弃该配置。比如disable_functions = exec, system中的空格会让system变成带前导空格的无效函数名,实际未被禁用。
验证函数是否真被拦截
不能只查phpinfo()页面里disable_functions字段是否显示,要实测调用:
创建测试脚本/var/www/html/test.php,内容为:<?php var_dump(exec('id')); ?>
用浏览器访问该URL,若返回空白页且PHP错误日志中出现Function exec is disabled警告,则说明生效;若返回用户ID字符串,说明配置未起作用,需回溯检查路径和重启动作。
CLI端同步验证:/usr/bin/php -r "var_dump(system('id'));",应输出NULL并报相同警告。两套环境都得过,才算真正堵死入口。
限制PHP脚本操作范围
仅禁函数不够,攻击者仍可能用scandir遍历目录或读取/etc/passwd。必须配合open_basedir:
在同一个FPM pool配置文件中,添加:php_admin_value[open_basedir] = /var/www/html:/tmp
【关键细节】 上传临时目录/tmp必须显式包含,否则文件上传功能会失败;但upload/子目录本身不应出现在open_basedir路径中,防止Webshell借此写入恶意文件。
如果网站根目录是/var/www/example.com,就写成/var/www/example.com:/tmp,结尾不加斜杠,否则/var/www/example.com1也会被意外允许访问。
收紧Web目录执行权限
方法一:禁止Web目录下所有PHP文件被执行
在Nginx配置中,对location ~ \.php$块添加:location ~ ^/upload/.*\.php$ { deny all; }
这能阻止上传目录里的PHP文件被解析执行,是防Webshell落地的关键一环。
方法二:Linux文件系统权限控制
执行:find /var/www/html -type f -name "*.php" -exec chmod 644 {} \;
再执行:find /var/www/html -type d -exec chmod 755 {} \;
确保PHP脚本只有读+写权限,没有执行位,连chmod +x都无效——Web服务器靠解释器运行,不需要文件自身有x权限。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











