一、系统与框架基础安全
app_debug设置为false,避免暴露详细的错误堆栈信息(如数据库结构、代码逻辑),防止攻击者利用敏感信息进行针对性攻击。public目录,而非应用根目录,避免直接暴露application、runtime等敏感目录。二、输入与数据安全防护
Validator类定义验证规则(如字段必填、长度限制、邮箱格式),对GET、POST、PUT等请求参数进行全面校验,防止SQL注入、XSS等攻击。例如:$validate = new \think\Validate([
'username' => 'require|max:25|min:3',
'email' => 'require|email'
]);
if (!$validate->check(input())) {
return json(['error' => $validate->getError()]);
}
htmlspecialchars()或ThinkPHP的filter_var函数过滤HTML标签及特殊字符,避免XSS攻击;对文件上传内容进行病毒扫描(如ClamAV),防止恶意代码植入。Db::name('user')->where('id', $id)->find())或查询构造器,避免直接拼接SQL语句;若需原生查询,务必使用预编译语句(PDO的prepare方法)绑定参数。三、常见Web攻击防护
think\middleware\VerifyCsrfToken),为表单添加_token隐藏字段(通过token()函数生成),验证请求的合法性,防止跨站请求伪造。{{ }}语法(Blade模板)或htmlentities()函数转义HTML标签,避免恶意脚本执行。jpg、png、gif)、大小(如不超过2MB),将上传目录设置为不可执行脚本(如chmod -R 755 public/uploads);对上传的文件重命名(如使用UUID),避免文件名包含恶意路径(如../../../evil.php)。四、身份认证与授权管理
firebase/php-jwt库生成Token,要求客户端在请求头中携带Authorization: Bearer <token>,服务端验证Token的有效性(签名、过期时间)。think-auth扩展或自定义中间件,根据用户角色(如管理员、普通用户)限制对敏感接口的访问。例如,定义路由规则时添加角色中间件:Route::group('admin', function () {
Route::get('dashboard', 'Admin/Dashboard/index')->middleware(\app\middleware\Auth::class);
})->allowCrossDomain();
中间件中校验用户角色是否具备访问权限。五、服务器与配置安全
firewalld或iptables)限制入站流量,仅开放必要端口(如80、443、22)。例如,使用firewalld允许HTTP/HTTPS流量:sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
阻止可疑IP段的访问(如sudo firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.100" drop')。session_driver=redis),提高会话存储的安全性和性能;启用会话加密(session_encrypt=true),防止会话劫持;设置合理的会话过期时间(如session_expire=1800秒,即30分钟)。www-data)对项目文件具有最小权限:
application、controller)设置为750(所有者可读写执行,组用户可读执行,其他用户无权限);public/assets)设置为755(允许其他用户读取);.env、config/database.php)设置为640(避免其他用户读取敏感信息,如数据库密码)。六、其他增强安全措施
return 301 https://$host$request_uri;),保护数据传输过程中的隐私(如用户密码、支付信息)。fail2ban或Nginx的limit_req_zone模块限制单个IP的访问频率(如每分钟最多60次请求),防止DDoS攻击或暴力破解。例如,Nginx配置:limit_req_zone $binary_remote_addr zone=api:10m rate=60r/m;
location /api/ {
limit_req zone=api burst=20 nodelay;
proxy_pass http://thinkphp_backend;
}
超过阈值的请求将被延迟或拒绝。PHPStan、RIPS)扫描项目代码,检测潜在的安全漏洞(如SQL注入、XSS);定期检查服务器日志(如/var/log/nginx/access.log、/var/log/php-fpm/error.log),分析异常请求(如大量404错误、频繁的POST请求)。