真正可靠的动态安全决策需依托Nginx原生上下文机制,通过map指令做静态映射实现CORS白名单、可疑请求识别与环境打标,在location中结合limit_req、if校验、CSP nonce及real_ip还原等策略落地执行。

直接用 if 或 return 硬拦请求,既难维护又容易出错。真正可靠的动态安全决策,得靠 Nginx 原生上下文机制——把判断逻辑提前“编译”进配置,让每次请求进来时,系统已准备好对应策略。
用 map 指令做轻量级行为映射
map 不执行逻辑,只做静态映射,性能高、无副作用,适合做第一层安全过滤:
- 匹配可信来源实现 CORS 白名单:定义
map $http_origin $cors_origin,只放行 localhost、预发域名等,其余自动为空,add_header Access-Control-Allow-Origin $cors_origin always就不会暴露敏感头 - 识别可疑请求组合:比如
map "$http_accept:$http_content_type" $is_suspicious,把text/html:(无 Content-Type 的 POST)或:text/plain(JSON 接口却发纯文本)标为 1,后续统一拦截 - 区分环境打标:结合
$host或自定义 header(如X-Env),映射出$env_level(dev/staging/prod),为不同环境启用不同强度的防护策略
在 location 中绑定上下文执行策略
map 只负责“算出结果”,真正执行得落在具体路径里,且必须注意作用域和生效时机:
- 对 API 路径(如
/api/)启用限流防探测:limit_req zone=api_fuzz burst=3 nodelay,key 用$binary_remote_addr$request_uri,精准识别参数遍历行为 - 对登录页强制校验 Referer 和 User-Agent 组合,防止 CSRF 或自动化爆破:
if ($http_referer = "" || $http_user_agent ~* "(sqlmap|nuclei|gau)") { return 403; } - 对静态资源路径(如
/static/)关闭脚本执行、禁用目录浏览,并注入严格 CSP:add_header Content-Security-Policy "default-src 'self'; script-src 'none';"
借助 request_id 实现一次性安全凭证
内联脚本需要 nonce 才能通过 CSP,而每次请求必须不同——$request_id 天然满足这个要求:
- 先用 map 做格式转换:
map $request_id $csp_nonce { default ""; "~^(.{8})(.{4})(.{4})" "$1$2$3"; },截取前 16 字符去横线,适配 base64 - 在响应头注入:
add_header Content-Security-Policy "script-src 'self' 'nonce-$csp_nonce';" always - 前端 HTML 中对应 script 标签写
nonce="xxx",Nginx 自动填值,无需后端参与,也不用改代码
结合真实客户端 IP 做可信网络判定
有 CDN 或 LB 时,$remote_addr 是代理 IP,必须还原真实地址才能建模:
- 配置
set_real_ip_from指定可信上游网段,再设real_ip_header X-Forwarded-For,确保$remote_addr是用户真实出口 IP - 用
geo指令划分区域:geo $is_internal { default 0; 10.0.0.0/8 1; 172.16.0.0/12 1; },内部流量可跳过部分验证 - 对高风险操作(如密码重置),只允许来自
$is_internal或已认证地区(如通过 GeoIP 库解析出的$geoip_country_code)的请求通过


















