温馨提示×

PHP如何在Linux上进行安全加固

小樊
35
2025-12-18 05:56:15
栏目: 编程语言

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关键安全配置

  • 信息泄露防护:关闭版本暴露与服务器标识
    • expose_php=Off
  • 远程代码执行防护:禁止远程文件包含与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作为纵深防御
    • 定期备份与恢复演练,变更前后进行配置审计与基线比对

0