Linux上PHP安全加固实操清单
一 基础与运行环境
- 保持系统与PHP版本为最新,及时修补漏洞;仅保留业务必需的PHP扩展,减少攻击面(如执行 php -m 检查并移除无用模块)。
- 运行身份与进程隔离:PHP-FPM使用非root运行用户(如www-data),监听套接字权限设为0660,所属用户/组与Web服务一致;禁止以root执行PHP。
- 网络与端口最小化:仅开放22/80/443,对外仅暴露必要服务;后台管理口限制来源IP。
- 传输安全:全站启用HTTPS,禁用明文HTTP访问。
- 基础命令示例:
- 更新系统:sudo apt update && sudo apt upgrade -y
- PHP-FPM监听权限:listen.owner=www-data; listen.group=www-data; listen.mode=0660
- UFW放行:sudo ufw allow 22,80,443/tcp && sudo ufw enable
二 php.ini关键安全配置
- 信息泄露防护:关闭版本暴露与服务器标识
- 远程代码执行防护:禁止远程文件包含与URL fopen
- allow_url_fopen=Off
- allow_url_include=Off
- 错误与日志:生产环境不显示错误,统一写入日志
- display_errors=Off
- log_errors=On
- error_log=/var/log/php_errors.log
- 资源与DoS防护:限制脚本执行时间、输入解析时间与内存
- max_execution_time=25
- max_input_time=25
- memory_limit=30M
- 请求与上传控制:限制POST大小,必要时关闭上传
- post_max_size=1M(按业务调整)
- file_uploads=Off(如无需上传)
- 危险函数禁用:按业务白名单保留,其余禁用
- disable_functions=exec,passthru,shell_exec,system,proc_open,popen,show_source,dl,parse_ini_file
- 文件系统访问限制:仅允许访问站点目录
- open_basedir=/var/www/html
三 Web服务器与PHP-FPM协同加固(Nginx示例)
- 静态资源目录禁止解析PHP,规则需置于通用PHP匹配之前:
- location ~ ^/images/.*.(php|php5)$ { deny all; }
- location ~ ^/static/.*.(php|php5)$ { deny all; }
- location ~ ^/data/(attachment|avatar)/.*.(php|php5)$ { deny all; }
- 通用PHP处理与路径校验:
- location ~ .php$ { include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_pass unix:/var/run/php/php7.x-fpm.sock; }
- 防止path_info漏洞:先校验文件是否存在再交给PHP解析
- 进程与权限:确保PHP-FPM与Nginx使用同一非root用户组,套接字权限0660,目录属主与运行用户一致。
四 文件系统与权限
- Web根目录与代码:
- 生产代码目录建议只读:find /var/www -type f -name “*.php” -exec chmod 444 {} ;
- 目录权限:find /var/www -type d -exec chmod 555 {} ;
- 对需要写入的目录(如上传、缓存、日志)单独放开,并严格限制可执行权限
- 上传目录安全:
- 禁止执行PHP:在上述静态资源规则中对上传目录同样应用“deny all”
- 上传后使用 move_uploaded_file 移动至目标目录,重命名并校验类型与大小
- 敏感文件保护:.env、配置文件、备份文件移出Web根目录或设置600权限,禁止Web直接访问
五 命令执行与输入安全及运维监控
- 命令执行最小化:
- 优先避免使用 exec/system/shell_exec 等;如确需调用系统命令,使用白名单校验并严格转义参数
- 示例:$allowed = [‘ls’,‘pwd’]; if (in_array($cmd, $allowed)) { … }
- 输入与输出安全:
- 输入过滤与校验(如 filter_var),输出到HTML前使用 htmlspecialchars,启用CSP降低XSS风险
- 数据库使用PDO/MySQLi预处理杜绝SQL注入
- 入侵排查与取证:
- 查找常见一句话木马特征:grep -r --include=*.php ‘[^a-z]eval($_POST’ /var/www
- 查找近期被修改的PHP文件:find /var/www -mtime -3 -type f -name “*.php”
- 审计与加固:
- 开启并定期审计PHP与Web服务日志;部署WAF/ModSecurity作为纵深防御
- 定期备份与恢复演练,变更前后进行配置审计与基线比对