PHP在Linux上的安全防护实践清单
一 系统与基础加固
- 保持系统与PHP处于最新稳定版本,及时应用安全补丁,优先修复已知漏洞(如升级到包含修复的版本,例如PHP 8.1.29等安全修复版本)。
- 配置防火墙/安全组,仅开放必要端口(如22/80/443),对管理口设置来源IP白名单。
- 运行身份遵循最小权限原则:PHP-FPM/Apache/Nginx工作进程使用非root专用用户(如www-data),避免使用高权限账户运行。
- 启用系统与安全审计:集中采集并定期审查系统与应用日志,保留关键审计轨迹。
二 PHP运行时与文件权限
- 精简攻击面:在 php.ini 中仅启用必要扩展,禁用不需要的模块与功能。
- 禁用危险函数:如exec、shell_exec、system、passthru、proc_open、popen等;必要时以白名单方式封装调用。
- 限制远程包含与协议:设置allow_url_fopen=Off、allow_url_include=Off,降低远程文件包含与代码执行风险。
- 错误与日志:生产环境display_errors=Off,开启error_log记录到安全可审计位置,避免泄露路径、凭证等敏感信息。
- 上传安全:限制上传类型/大小/名称,将上传目录移出Web可直接访问路径,或配置不可执行;上传后执行病毒扫描与内容校验。
- 路径隔离:使用open_basedir将PHP脚本访问范围限制在指定目录树内。
- 会话安全:启用session.cookie_httponly=On、session.cookie_secure=On(HTTPS)、合理设置session.gc_maxlifetime,必要时使用session_regenerate_id。
- 性能与抗攻击:启用OPcache(如 memory_consumption=128、interned_strings_buffer=8、max_accelerated_files=4000),减少暴露面并提升抗压。
- 文件权限与属主:Web根目录与代码文件建议644,目录755;上传目录750且不可执行;进程属主与Web目录一致(如www-data:www-data)。
三 Web服务器与进程隔离(以Nginx+PHP-FPM为例)
四 命令执行与输入验证
- 尽量避免使用**eval()、exec()、shell_exec()、system()、passthru()、proc_open()**等可执行系统命令的函数;如确需使用,必须:
- 对输入进行严格校验与白名单限制;
- 使用escapeshellarg/escapeshellcmd对参数转义;
- 以最小权限身份运行(如通过sudo到受限用户,仅授予必要命令)。
- 示例白名单执行:
$allowed = ['ls','pwd'];
$cmd = $_GET['c'] ?? '';
if (in_array($cmd, $allowed, true)) {
$out = shell_exec(sprintf('%s 2>&1', escapeshellcmd($cmd)));
echo htmlspecialchars($out, ENT_QUOTES, 'UTF-8');
} else {
http_response_code(403);
exit('Forbidden');
}
- 数据库与输出安全:使用PDO/MySQLi预处理语句防SQL注入;输出到HTML前使用htmlspecialchars,并配置CSP降低XSS风险。
五 运行时防护与持续运维
- 入侵防护与WAF:部署ModSecurity等WAF,结合自定义规则拦截常见攻击(SQLi、XSS、RFI、文件上传漏洞利用等)。
- 强制访问控制:启用SELinux或AppArmor,为PHP-FPM/Apache/Nginx定义细粒度访问策略,限制对敏感文件与系统命令的访问。
- 资源限制:在PHP-FPM与Web服务器层面限制内存、CPU、请求时长、并发连接数,缓解DoS与资源耗尽风险。
- 备份与演练:定期备份代码、配置、数据库并验证可恢复性;制定应急响应预案与演练计划。
- 安全评估:定期使用OWASP ZAP等工具进行漏洞扫描与配置基线核查,持续修复与加固。