防止开放重定向漏洞需在nginx层实施白名单校验、静态兜底、参数过滤三重控制:严格校验跳转参数仅允许站内相对路径,禁用动态host拼接,统一添加安全响应头,并关闭隐式重定向入口。

防止开放重定向漏洞的关键,是不让用户可控的输入(比如 redirect= 参数或 $host 变量)直接参与跳转地址构造。Nginx 层必须做白名单校验、静态兜底、参数过滤三重控制。
严格校验跳转参数,禁止协议和域名拼接
业务若需支持跳转(如登录后返回原页面),不能直接用 $arg_redirect 拼接 302 响应。必须只允许站内相对路径:
- 用正则拒绝含
http://、https://、//、@或 IP 地址的值 - 示例拦截规则(放在对应 location 中):
if ($args ~* "(redirect|next|url)=([^&]*://|//|@|\d{1,3}\.\d{1,3}\.)") { return 400; } - 只放行以
/dashboard、/profile、/help等预设前缀开头的路径
禁用动态 host 拼接,优先使用 $server_name
$host 来自请求头,可被伪造(如发送 Host: evil.com),导致跳转到任意域。安全做法是:
- 单域名场景:硬编码目标地址,如
return 301 https://www.example.com$request_uri; - 多域名场景:用
if + 正则白名单校验$host后再跳转,否则直接return 403 - 更稳妥方式:改用
$server_name(配置中显式声明的合法域名),它不可被客户端篡改
统一在 server 块加安全响应头,覆盖所有跳转响应
301/302 响应本身要携带防护头,不能依赖后端或 location 规则——因为重定向不进 location 流程:
- 添加
add_header X-Content-Type-Options "nosniff" always; - 添加
add_header X-XSS-Protection "1; mode=block" always; - 清除危险头:
more_clear_headers "Server" "X-Powered-By";(需启用 headers_more 模块) - HSTS 必须在 HTTPS 的
server { listen 443 ssl; }块中配置,并带always参数
关闭隐式重定向入口,堵死绕过路径
很多开放重定向漏洞源于未被意识到的默认行为:
- 禁用空
Host头响应:server { listen 80; server_name ""; return 444; } - 关闭目录列表:
autoindex off;,防止路径猜测辅助钓鱼 - 限制 HTTP 方法:
limit_except GET HEAD POST { deny all; },禁用 TRACE/DEBUG 等探测方法 - 对已下线跳转入口(如
/auth/callback?redirect=)加 Referer 校验:valid_referers server_names *.example.com;,不匹配则return 403











