ThinkPHP 在 CentOS 的安全防护清单
一 基础部署与运行环境
- 将 Web 根目录指向 public,不要把应用目录或框架目录暴露在 Web 可访问路径;如需自定义入口位置,务必同步调整路由重写与资源路径,避免泄露目录结构。生产环境严禁使用带有漏洞的旧版本,及时升级 ThinkPHP 与依赖组件。关闭调试与错误回显:设置环境变量 APP_DEBUG=false,并在 PHP 中关闭 display_errors,仅保留日志记录。为应用配置强随机的 app_key,用于加密与签名。以上措施可显著降低信息泄露与 RCE 利用面。
二 目录与文件权限
- 遵循“最小可写”原则:全站文件默认只读,仅对需要写入的目录开放写权限,尤其是 runtime(缓存/日志)与 upload(上传)目录。示例(按需调整路径):
- 只读基线:find /var/www/your-app -type f -exec chmod 644 {} ; && find /var/www/your-app -type d -exec chmod 755 {} ;
- 可写例外:chmod 775 /var/www/your-app/runtime /var/www/your-app/public/upload
- 禁止上传与缓存目录执行 PHP:在 Nginx 统一拦截,防止上传 Webshell 被执行。示例:
- location ~* /(runtime|upload)/(.*).php$ { return 403; }
- 禁止目录索引与敏感文件访问:在站点配置或服务器层关闭 Indexes,并限制访问 .env、.git、.log、.sql、*.bak 等敏感文件。
- 若历史原因无法将框架置于非 Web 目录,可在入口或部署阶段生成目录安全文件(如 BUILD_DIR_SECURE=true),写入 index.html 空文件或自定义提示,降低目录遍历与误访问风险。
三 应用层安全配置
- 输入验证与过滤:始终通过 Request 对象获取参数,优先使用验证器与类型强制(如 param(‘id/d’)),对批量数据使用 only() 白名单,必要时设置全局 default_filter。输出阶段对变量进行 htmlentities/htmlspecialchars 转义,避免 XSS。
- SQL 注入防护:统一使用 PDO 预处理/参数绑定 或 ORM 链式调用,避免字符串拼接与 whereRaw/whereExp 直接拼接用户输入;原生 SQL 必须使用占位符与参数数组。
- 表单与状态变更安全:开启并强制使用 CSRF 令牌,对敏感操作使用 POST/PUT/PATCH/DELETE 语义化方法,GET 仅用于读取;重要业务配合权限校验与幂等控制。
- 会话安全:开启 HttpOnly、Secure 等 Cookie 标志,并在会话启动时执行 Session::regenerate(true),降低会话劫持风险。
- 文件上传安全:使用框架提供的上传校验(后缀、MIME、大小、图片合法性),限制上传目录不可执行,必要时接入 云 OSS 等隔离存储;上传后执行病毒/恶意特征扫描。
四 服务器与网络防护
- 防火墙与端口最小化:使用 firewalld/iptables 仅开放 80/443/22(或管理端口),数据库(如 3306)仅内网/云内访问,云上通过 安全组白名单 控制来源;避免暴露管理端口到公网。
- PHP 安全基线:在 php.ini 中关闭 display_errors,开启 log_errors;禁用高危函数(如 eval、exec、shell_exec、passthru、popen、proc_open、symlink、chroot、chgrp、chown 等);限制 open_basedir 指向项目目录;上传大小与执行超时按业务合理设置。
- 访问控制与速率限制:对异常路径、扫描特征与高频请求进行 403/429 处置;后台与敏感接口增加 IP 白名单 或 JWT/API Key 强认证;对外仅提供 HTTPS。
- 日志与监控告警:站点与 Nginx/PHP-FPM 访问/错误日志落盘到独立分区,配置 logrotate 按日切割并长期保留;使用 inotifywait 监控上传与缓存目录的异常文件创建/移动事件,结合告警脚本处置;云上启用 安全中心/态势感知 对异地登录、Webshell、漏洞告警进行即时响应。
五 上线前自检与应急响应
- 自检清单:确认 APP_DEBUG=false、关闭 display_errors;全站 HTTPS;入口唯一且重写规则正确;runtime、upload 不可执行且仅授权写入;上传白名单与大小限制生效;无 .env/.git 等敏感文件对外;RDS/数据库账号最小权限、云安全组仅放行业务来源;备份与回滚方案可用。
- 应急响应:发现 Webshell 或可疑文件时,立即下线站点或切换 维护页,隔离可疑文件与时间窗口内上传内容;回滚至上一个稳定版本或最近干净备份;检查 runtime/log 与访问日志定位入侵路径;修补漏洞、重置密钥与数据库口令、更新证书;复核安全组/防火墙规则与开放端口;复测通过后恢复服务并保留取证材料。