CentOS服务器上加固 ThinkPHP 的安全实践
一 基础加固与运行环境
- 保持系统与组件为最新:执行sudo yum update -y,并及时更新 PHP 与扩展,减少已知漏洞面。
- 关闭生产环境的错误回显:在 php.ini 中设置display_errors = Off,避免泄露路径、SQL、堆栈等敏感信息。
- 合理配置 PHP:如memory_limit = 256M、max_execution_time = 30,降低被滥用风险。
- 正确设置文件权限:项目目录建议755,Web 可写目录(如runtime、upload)按需放开写入,其他目录禁止写入;Web 根目录仅暴露public。
- 启用 HTTPS:部署有效 SSL/TLS 证书,强制全站 HTTPS,保护传输数据。
- 配置防火墙:使用 firewalld/iptables 仅开放必要端口(如 80/443),减少攻击面。
二 ThinkPHP 应用层安全配置
- 关闭调试:生产环境务必设置app_debug = false,防止调试信息泄露与调试模式下的高危风险。
- 输入验证与过滤:使用框架验证器对参数进行严格校验(必填、长度、格式、范围等),对输出进行转义,降低 XSS/SQL 注入风险。
- 防注入:始终使用查询构造器/参数绑定/ORM,避免字符串拼接 SQL。
- 防 CSRF:为表单与敏感请求启用CSRF 令牌,设置SameSite=Strict/Lax 与 HttpOnly Cookie,必要时校验 Referer。
- 会话安全:配置会话 Cookie 的secure、httponly、samesite 等属性,启用会话加密与合理过期时间。
- 安全响应头:启用 CSP(Content-Security-Policy) 等安全头,减少脚本执行与数据泄露风险。
- 错误处理:开启日志记录,关闭向用户展示错误详情与堆栈。
三 文件上传与目录防护
- 上传校验:限制文件类型、大小、扩展名,校验 MIME 与内容;上传目录使用随机子目录、重命名文件名,避免覆盖与猜测。
- 禁止执行脚本:对runtime、upload等上传/缓存目录,禁止解析 PHP,返回 403。Nginx 示例:
location ~* /(runtime|upload)/(.*).php$ { return 403; }
- 目录隔离:将 public 设为唯一对外访问目录,框架与应用目录移出 Web 可访问范围;为各目录放置空 index.html 防止目录遍历。
- 定期清理:定时清理 runtime 缓存与临时文件,减少敏感信息残留。
四 服务器与网络层加固
- 访问控制:仅开放必要端口(如 22/80/443),对管理口与数据库端口限制来源 IP。
- 速率限制与防暴力:对登录、注册、接口调用等关键路径启用限流/限速与失败重试限制,缓解爆破与滥用。
- 组件与依赖更新:定期执行composer update,及时修补框架与第三方库漏洞;数据库账户遵循最小权限原则。
- 安全审计与备份:定期安全审计/代码扫描,并对代码、配置与数据库进行离线备份与异地保存,确保可快速恢复。
五 常见漏洞与快速处置
- 已知漏洞处置:一旦官方发布漏洞通告,优先升级 ThinkPHP 到修复版本或应用官方补丁;切勿长期停留在存在 RCE/SQLi 等风险的旧版本。
- 日志与 Webshell 排查:检查 runtime/log 是否存在敏感信息泄露;全站排查新增或可疑 .php 文件(重点在 upload、runtime),发现即隔离与溯源。
- 上传目录可执行性复核:再次确认 Nginx/Apache 已禁止 upload/runtime 目录执行 PHP;清理历史可执行脚本残留。
- 临时缓解:无法立即升级时,可临时关闭危险功能、加强输入校验与访问控制,并尽快安排升级窗口。