一、系统与环境安全加固
sudo yum update -y命令,确保CentOS系统及所有安装的软件包(如PHP、Web服务器、数据库)均为最新版本,及时修复已知安全漏洞。php.ini文件,调整关键参数:display_errors = Off(生产环境关闭错误显示,防止敏感信息泄露)、memory_limit = 256M(限制内存使用,避免资源耗尽攻击)、max_execution_time = 30(限制脚本执行时间,防范长时间运行的恶意脚本)。二、ThinkPHP框架自身安全配置
.env文件中设置强随机密钥(APP_KEY=base64:your_random_generated_key),用于会话、Cookie等敏感数据的加密。可使用php think encrypt:key命令生成安全密钥,避免密钥泄露导致的解密风险。config/app.php中将app_debug设置为false,生产环境下禁用详细错误提示,防止攻击者通过错误信息获取系统路径、数据库结构等敏感内容。application目录下不使用的模块文件夹(如extra、vendor中未使用的组件),并在config/app.php中注释对应模块配置,减少攻击面。三、输入与数据安全防护
Validate类定义严格验证规则(如$rule = ['username' => 'require|max:25|min:3', 'email' => 'require|email'];),对用户输入的用户名、邮箱、密码等数据进行格式校验;同时通过input('post.', 'trim,strip_tags,htmlspecialchars')或全局过滤配置(config/app.php中default_filter)过滤恶意字符(如<script>标签、SQL关键字),防范XSS注入与SQL注入。Db::name('users')->where('username', $username)->find())或ORM模型(如User::get($id)),避免直接拼接SQL语句;若需使用原生SQL,必须通过参数绑定(如Db::execute("SELECT * FROM think_user WHERE id = ?", [$id]))传递变量,防止SQL注入。validate方法限制上传文件的类型与大小(如$file->validate(['size' => 1024*1024*2, 'ext' => 'jpg,png,gif'])),仅允许上传图片等安全格式;将上传文件存储至非Web可访问目录(如runtime/uploads),并通过Nginx/Apache配置禁止直接访问该目录,防止恶意文件执行。四、会话与身份认证安全
config/session.php中配置会话驱动为redis(高性能且支持分布式),并开启数据加密(encrypt = true);设置合理的会话过期时间(expire = 1800,单位:秒),避免会话固定攻击。五、网络安全防护
listen 443 ssl;),强制所有流量通过HTTPS传输,防止数据在传输过程中被窃取或篡改。firewalld或iptables限制入站流量,仅开放必要的端口(如HTTP的80端口、HTTPS的443端口、SSH的22端口);通过firewall-cmd --permanent --add-service=http和firewall-cmd --permanent --add-service=https命令开放服务端口,并执行firewall-cmd --reload使配置生效。think-throttle扩展或Nginx的limit_req_zone指令,对同一IP地址的请求频率进行限制(如每分钟最多60次请求),防止DDoS攻击或暴力破解密码。六、文件与目录权限控制
chmod -R 755 /path/to/thinkphp/project命令设置项目目录权限,确保Web服务器用户(如www-data、nginx)仅具有读取和执行权限,避免写入权限导致恶意代码植入;对于runtime(缓存、日志)、uploads(上传文件)等目录,设置为775权限(需写入),但需确保目录所有者为用户而非Web服务器。public目录(而非项目根目录),避免攻击者直接访问application(应用逻辑)、config(配置文件)等敏感目录;通过Nginx配置root /path/to/thinkphp/public;实现。七、安全审计与维护
composer audit命令检查ThinkPHP框架及依赖包的安全漏洞,及时更新存在漏洞的组件;定期审查项目代码,重点检查用户输入处理、数据库操作、文件上传等环节,修复潜在的安全隐患。config/log.php中设置level = 'error'),记录错误信息和异常操作;使用logrotate工具定期归档日志,防止日志文件过大;定期备份数据库(如使用mysqldump)和项目文件,存储至异地服务器,确保数据丢失后可快速恢复。