Nginx 是实时阻断攻击的首选位置,应在 server 块顶层用 if + 正则匹配 URI 和参数中的高危模式,如目录遍历、SQL 注入关键词、XSS 载荷等并返回 403。

ThinkPHP 本身不负责网络层拦截,真正能实时阻断攻击特征的位置是 Nginx —— 它在请求抵达 PHP 解析前就完成识别与拒绝。把防御逻辑前置到 Nginx 层,既能减轻 ThinkPHP 负担,又能拦截大量恶意流量(如 SQL 注入、XSS 载荷、目录遍历),避免攻击进入应用层。
用 if + 正则在 URI 和参数中匹配高危模式
这是最直接有效的方式,适用于防御扫描器探测、注入尝试等。规则需放在 server 块顶层(不能嵌套在 location 内),确保早于 try_files 或 proxy_pass 执行:
- 拦截原始或 URL 编码的目录遍历:
if ($request_uri ~ "(\.\./|/\.\.|%2e%2e|\.%2e)") { return 403; } - 屏蔽常见 SQL 注入关键词(不区分大小写):
if ($args ~ "(union\s+select|sleep\(|load_file|information_schema)") { return 403; } - 拦截 XSS 测试载荷:
if ($args ~ "(<script return></script>
用 map + if 统一管理风险信号,提升可维护性
避免大量 if 堆砌导致配置混乱。先用 map 提取风险变量,再集中判断:
- 定义可疑 UA:
map $http_user_agent $is_scanner { default 0; "~*sqlmap|nikto|gobuster|acunetix" 1; } - 定义危险参数模式:
map $args $has_path_traversal { default 0; "~*(file|path|url)=.*(\.\.|%2e)" 1; } - 统一拦截:
if ($is_scanner = 1) { return 403; } if ($has_path_traversal = 1) { return 403; }
对敏感路径和文件类型做硬性禁止
ThinkPHP 项目常暴露调试接口、备份文件或上传目录,Nginx 可直接切断访问:
- 禁止访问隐藏文件和版本控制目录:
location ~ /\. { return 404; } - 封禁常见敏感后缀:
location ~* \.(bak|sql|log|env|git|zip|rar)$ { return 404; } - 限制上传目录执行脚本:
location ~* ^/(uploads|public/uploads)/.*\.(php|php5|phtml)$ { return 444; }
配合限流机制防暴力探测和爆破
针对 ThinkPHP 的登录、API 接口等高频入口,用 limit_req 控制请求节奏,让自动化工具失效:
- 在 http 块定义限流区:
limit_req_zone $binary_remote_addr zone=login:10m rate=5r/m; - 在 login 接口 location 中启用:
limit_req zone=login burst=3 nodelay; - 超限即返回 503,无需等待 PHP 启动,也避免触发 ThinkPHP 日志或数据库查询
这些配置全部生效于 Nginx 工作进程内,毫秒级响应,不依赖 PHP 扩展或中间件。只要 reload 配置,防护立即上线,是 ThinkPHP 应用最轻量、最可靠的首道防线。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











