核心是禁用高危函数并阻断用户输入拼接命令:在php.ini中设置disable_functions=exec,passthru,shell_exec,system,proc_open,popen,pcntl_exec,关闭allow_url_fopen和allow_url_include,重启服务;严格白名单校验输入,必须执行命令时对参数逐个escapeshellarg()处理,并限制PHP运行权限。

修复PHP命令注入漏洞,核心是切断用户输入与系统命令执行之间的直接关联。不能让任何外部数据未经严格处理就进入system、exec、shell_exec、passthru等函数。
禁用或限制高危函数
在生产环境的php.ini中,直接禁用明确不需要的危险函数:
- 设置
disable_functions = exec,passthru,shell_exec,system,proc_open,popen,pcntl_exec - 同时关闭
allow_url_fopen = Off和allow_url_include = Off,防止远程文件包含类攻击作为命令注入的跳板 - 重启Web服务器使配置生效
彻底避免拼接用户输入执行命令
即使做了过滤,也不应把用户输入拼进命令字符串。常见错误写法如:
$ip = $_GET['host']; system("ping -c 4 " . $ip);
立即学习“PHP免费学习笔记(深入)”;
正确做法是:
- 改用白名单校验:只允许符合特定格式(如IPv4/IPv6)的输入,其他一律拒绝
- 使用
filter_var($ip, FILTER_VALIDATE_IP)验证IP地址 - 若必须调用外部工具,优先选用PHP原生替代方案(如
gethostbyaddr()代替nslookup)
必须执行命令时的安全加固
极少数场景确实需要调用系统命令(如网络探测、日志归档),此时务必做到:
- 对每个参数单独使用
escapeshellarg()包裹,而不是对整个命令字符串调用escapeshellcmd() - 不依赖
escapeshellcmd()做主过滤——它无法防御$(...)、反引号、空格绕过等手法 - 确保运行PHP进程的系统用户权限最低,禁止其访问数据库、敏感目录或执行提权操作
- 将命令输出重定向到临时沙箱目录,避免覆盖关键文件
补充性防御措施
纵深防御能显著提高攻击门槛:
- 开启
open_basedir限制PHP脚本能访问的文件路径范围 - Web服务器层(如Nginx/Apache)配置规则,拦截含
;、|、&&、`、$()等字符的请求参数 - 记录所有命令执行日志(包括原始输入和返回码),便于事后溯源
- 定期扫描代码,搜索
system(、exec(等关键词,确认无遗漏调用点



















