定期更新ThinkPHP框架至最新稳定版本(如通过Composer执行composer update topthink/framework),及时修复已知安全漏洞(如远程代码执行、SQL注入等);同时,保持Debian系统及PHP包的最新状态(sudo apt update && sudo apt upgrade -y),确保系统层面的安全补丁应用。
config/app.php中设置'show_error_msg' => false,或在php.ini中配置display_errors = Off、log_errors = On,将错误信息记录到/var/log/php_errors.log而非直接输出,避免敏感信息(如数据库结构、代码逻辑)泄露。config/app.php中开启'csrf_on' => true,并为表单添加{{ csrf_token() }}字段,验证请求的合法性,防止跨站请求伪造攻击。config/auth.php设置基于角色的访问控制(RBAC),限制用户对敏感接口(如后台管理、数据修改)的访问,确保最小权限原则。使用ThinkPHP的Validate类对用户输入进行严格验证(如邮箱、手机号格式),并对输出数据进行转义(如{{ htmlspecialchars($data) }}),防止SQL注入、XSS跨站脚本攻击。例如:
$validate = Validate::rule([
'username' => 'require|max:25',
'password' => 'require|min:6'
]);
if (!$validate->check(input())) {
return json(['code' => 400, 'msg' => $validate->getError()]);
}
```。
#### **4. 优化文件上传安全**
限制上传文件的类型(如仅允许图片、文档)、大小(如不超过2MB),并将上传目录(如`runtime/uploads/`)设置为不可执行脚本(通过`chmod -R 755 uploads/`),防止上传webshell。示例配置:
```php
// config/upload.php
return [
'exts' => 'jpg|png|doc|pdf',
'maxSize' => 2097152, // 2MB
'autoSub' => true,
'subName' => ['date', 'Ymd']
];
```。
#### **5. 配置Debian系统级安全**
- **防火墙设置**:使用`ufw`限制仅允许HTTP(80)、HTTPS(443)、SSH(22)端口访问,阻止非法IP连接:
```bash
sudo ufw enable
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 22/tcp
sudo ufw reload
```。
- **文件权限管理**:设置Web目录(如`/var/www/html/your_project`)的所有者为`www-data`(Apache/Nginx用户),权限为`755`(目录)和`644`(文件),敏感配置文件(如`.env`)权限设为`600`:
```bash
chown -R www-data:www-data /var/www/html/your_project
find /var/www/html/your_project -type d -exec chmod 755 {} \;
find /var/www/html/your_project -type f -exec chmod 644 {} \;
chmod 600 /var/www/html/your_project/.env
```。
- **禁用危险PHP函数**:编辑`/etc/php/8.x/fpm/php.ini`(根据PHP版本调整),禁用`eval`、`exec`、`system`等高危函数:
```ini
disable_functions = eval,exec,passthru,shell_exec,system
```。
#### **6. 部署额外安全工具**
- **防篡改保护**:使用`护卫神·防入侵系统`等工具,开启ThinkPHP防篡改模板,防止黑客修改PHP文件;或通过ACL策略限制`runtime/`、`uploads/`目录仅能写入,禁止执行脚本。
- **Web应用防火墙(WAF)**:部署ModSecurity或Cloudflare WAF,过滤恶意请求(如SQL注入、XSS),增强应用层防护。
- **日志监控与审计**:使用`Logwatch`或`Fail2ban`监控系统日志(`/var/log/syslog`)和应用日志(`runtime/log/`),自动封禁频繁攻击的IP地址。
#### **7. 其他安全实践**
- **使用HTTPS**:通过Let's Encrypt申请免费SSL证书,强制使用HTTPS加密数据传输(在Nginx中配置`ssl_certificate`和`ssl_certificate_key`),防止中间人攻击。
- **限制会话安全**:在`config/session.php`中设置`'expire' => 3600`(会话过期时间1小时)、`'use_only_cookies' => true`(仅使用cookie存储会话ID),并开启`'httponly'`和`'secure'`选项,防止会话劫持。
- **避免危险函数**:在代码中避免使用`eval()`、`assert()`等动态执行函数,减少代码注入风险。