Nginx能否根据Cookie值拦截请求?如何拦截PHPSESSID等指定Cookie值的请求?
该操作完全可实现,Nginx原生支持通过匹配Cookie字段对请求进行拦截,以下是具体配置方案:
如果仅需要拦截单个固定Cookie值,可直接在对应站点的server配置块中添加规则,示例如下(以拦截PHPSESSID值为bad123456xyz的请求为例):
server { listen 80; server_name 你的站点域名; # 精确匹配指定Cookie值后拦截 if ($cookie_PHPSESSID = "bad123456xyz") { # 攻击量较大时可改为 return 444; 直接断开连接降低资源消耗 return 403; } # 原有站点配置内容保持不变... }
规则说明:$cookie_为Nginx内置Cookie变量前缀,后接Cookie的键名即可获取对应值,匹配逻辑为完全精确匹配,大小写和特殊字符需和攻击者携带的Cookie完全一致才能命中。
如果需要同时拦截多个不同的恶意Cookie值,推荐使用map指令实现,性能优于多条if判断:
- 首先在Nginx全局配置的
http块中添加映射规则:
http { # 原有全局配置内容保持不变... map $cookie_PHPSESSID $is_bad_cookie { default 0; "bad123456xyz" 1; "bad789012abc" 1; "bad345678efg" 1; # 可在此处新增更多需要拦截的Cookie值 } }
注意:map指令必须放在http块中,不能写在server块内
- 之后在对应站点的
server块中添加拦截规则:
server { listen 80; server_name 你的站点域名; if ($is_bad_cookie = 1) { return 403; } # 原有站点配置内容保持不变... }
配置生效方法
修改完配置后先执行命令nginx -t校验配置语法是否正确,确认返回syntax is ok、test is successful后,执行nginx -s reload重载配置即可生效。
额外优化建议
- 可将拦截的请求单独记录日志,方便后续排查和更新恶意Cookie列表,示例配置:
if ($is_bad_cookie = 1) { access_log /var/log/nginx/malicious_cookie.log; return 444; }
- 如果站点使用了CDN服务,需要确认CDN会透传原始请求的Cookie字段,否则规则会无法命中。
内容的提问来源于stack exchange,提问作者J.Mae
相关产品推荐
相关产品推荐

