CentOS服务器上保障ThinkPHP安全的实用清单
一 系统与基础环境加固
- 保持系统与应用为最新:执行sudo yum update -y;框架与依赖使用composer update及时打补丁。
- 关闭生产环境错误回显:在php.ini中设置display_errors = Off,将错误写入日志而非页面。
- 合理配置PHP:如memory_limit = 256M、max_execution_time = 30,并隐藏PHP版本、禁用不必要的函数与扩展,减少攻击面。
- 启用HTTPS:部署SSL/TLS证书,强制全站HTTPS,保护传输数据。
- 边界与访问控制:使用firewalld/iptables仅开放必要端口(如80/443),对管理口与敏感接口设置来源限制与访问控制。
二 ThinkPHP应用层安全配置
- 关闭调试:生产环境务必设置app_debug = false,避免泄露路径、配置与数据库凭据等敏感信息。
- 入口与目录隔离:将Web根目录指向public/,仅公开入口文件;禁止直接访问application/、thinkphp/、**runtime/**等目录。
- 输入校验与过滤:使用框架验证器对参数进行必填、长度、格式等校验,配合htmlspecialchars/strip_tags等输出过滤,降低SQL注入/XSS风险。
- 安全查询:始终使用查询构造器/参数绑定/预处理语句,禁止字符串拼接SQL。
- 会话安全:配置会话type=file/redis、设置合理expire(如1800秒)、开启encrypt等,防止会话劫持。
- 表单与接口防护:启用CSRF令牌;API使用JWT/API Key并配合RBAC进行权限控制。
三 文件上传与目录权限
- 上传校验:限制文件类型(如仅jpg/png/gif)、大小(如≤2MB),校验通过后移动到public/uploads等隔离目录。
- 目录访问控制:禁止访问runtime/(日志、缓存)等敏感目录;上传目录禁止执行PHP(Nginx可通过**location ~ .php$**策略拦截)。
- 最小权限原则:项目目录建议755,文件644;仅对需要写入的目录(如runtime、uploads)赋予Web服务写权限,避免全局可写。
- 防篡改与Webshell防御:对关键目录启用企业级防篡改;部署OpenRASP等运行时防护,拦截写Shell与危险函数调用。
四 服务器与网络层防护
- Web服务器配置:在Nginx中仅允许public/index.php解析PHP,其他**.php请求一律拒绝;对runtime/**、application/等路径返回403。
- 防火墙与端口:通过firewalld仅放行80/443,限制数据库、管理端口对外访问;对外管理口可限制来源IP。
- 速率限制与防暴力:对登录、注册、接口调用等关键路径启用限流/限速,缓解暴力破解与DDoS。
- 组件与扩展治理:禁用远程包含/allow_url_fopen等危险特性,关闭无用扩展,降低被利用风险。
五 运维与应急响应
- 备份与恢复:定期备份代码、数据库与配置,并进行离线/异地留存与恢复演练,确保可快速回滚。
- 安全审计与监控:定期审计代码与依赖、关注ThinkPHP官方与安全通告;开启访问与错误日志,对异常请求与登录失败进行告警。
- 升级与修复流程:升级前完整备份;优先使用Composer或官方渠道升级,复杂项目先在测试环境验证;发生入侵时先隔离、取证、清理后门并修补漏洞再恢复。
- 安全基线示例(可直接落地):
- php.ini:display_errors=Off,expose_php=Off,disable_functions=exec,passthru,shell_exec,system,proc_open,popen(按需调整),allow_url_fopen=Off;
- Nginx:仅**/public/index.php可解析PHP,其他.php*返回403;location ~ ^/(runtime|application|thinkphp)/ { return 403; };
- ThinkPHP:app_debug=false,session.encrypt=true,session.expire=1800,API启用JWT+RBAC与CSRF。