You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Nginx反向代理如何彻底隐藏源站信息,仅传递用户IP与User-Agent?

Nginx反向代理如何彻底隐藏源站信息,仅传递用户IP与User-Agent?

看起来你已经在做反向代理隐藏源站信息的工作了,但部分请求还是泄露了源站信息,咱们一步步来排查和优化配置,同时梳理可能泄露信息的其他渠道:

一、优化Nginx配置,确保关键头部被正确覆盖

你当前的配置已经处理了Referer、Origin和Cookie,但有几个关键遗漏和可以加强的点:

1. 明确传递用户真实的User-Agent

你没在配置里显式设置User-Agent,虽然Nginx默认会保留客户端的UA,但为了确保万无一失,最好明确添加:

proxy_set_header User-Agent $http_user_agent;

2. 处理现代浏览器的Fetch Metadata Headers

现代浏览器会发送Sec-Fetch-SiteSec-Fetch-ModeSec-Fetch-Dest这些头部,它们会直接标明请求的来源类型(比如跨站、同站),这可能泄露源站信息,需要清空或覆盖:

proxy_set_header Sec-Fetch-Site "";
proxy_set_header Sec-Fetch-Mode "";
proxy_set_header Sec-Fetch-Dest "";

3. 确保IP传递的准确性

你的IP相关配置是对的,但要注意X-Forwarded-For会累加IP,如果你的代理前面还有其他反向代理,可能需要调整,但如果是直接面向用户的代理,当前配置没问题。

优化后的完整配置

location /rvsprx {
    # 强制设置请求来源为myapp
    proxy_set_header Referer         "https://www.myapp.com";
    proxy_set_header Origin          "https://www.myapp.com";

    # 传递用户真实IP和UA
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Real-IP       $remote_addr;
    proxy_set_header User-Agent      $http_user_agent;

    # 彻底清除Cookie相关信息
    proxy_hide_header                Set-Cookie;
    proxy_ignore_headers             Set-Cookie;
    proxy_set_header                 Cookie "";

    # 清除可能泄露源站的Fetch Metadata Headers
    proxy_set_header Sec-Fetch-Site  "";
    proxy_set_header Sec-Fetch-Mode  "";
    proxy_set_header Sec-Fetch-Dest  "";

    # 使用可靠DNS解析
    resolver                         8.8.8.8;

    # 动态代理到目标地址
    proxy_pass                       $arg_dest;
}

二、为什么部分请求还是会泄露源站信息?

可能的原因有这些:

  • 浏览器安全策略:某些浏览器在跨域场景下,可能会强制发送真实的Origin头部(比如针对POST请求),你可以尝试将Origin设置为空字符串来测试:proxy_set_header Origin "";(不过这可能导致部分外部服务器拒绝请求,需要根据实际情况调整)。
  • 源站页面的CSP策略:如果嵌入你脚本的网站设置了严格的Content-Security-Policy,可能会影响浏览器发送的Referer或其他头部,你可以在代理返回的响应中添加add_header Referrer-Policy "strict-origin-when-cross-origin";来统一控制Referer的发送规则。
  • 未完全覆盖的自定义头部:有些网站会添加自己的自定义请求头部(比如X-Site-IDX-App-Version),这些头部会被Nginx默认传递,你需要通过proxy_set_header 头部名称 "";来清空它们。

三、除了Referer、Origin、Cookie,还有哪些信息可能泄露源站?

确实还有其他潜在的泄露点:

  • Fetch Metadata Headers:前面提到的Sec-Fetch-*系列头部,是现代浏览器的标准头部,必须处理。
  • 自定义请求头部:如上面所说,源站页面可能添加的自定义头部,需要排查并清空。
  • Referrer-Policy响应头:如果源站设置了宽松的Referrer-Policy,浏览器可能会发送完整的源站URL作为Referer,你需要在代理中统一设置响应头来控制。
  • 请求的Referer自动补全:部分浏览器在Referer为空时,会自动补全当前页面的URL,所以强制设置Referer为你的myapp地址很关键。

四、调试建议

你可以用curl模拟源站的请求,查看代理实际发送的头部:

curl -H "Referer: https://somesite.com" -H "Origin: https://somesite.com" -H "Sec-Fetch-Site: cross-site" https://www.myapp.com/rvsprx?dest=https://www.externalserver.com/landing.html -I

同时结合外部服务器的日志,找出哪些头部还在泄露源站信息,再针对性处理。

备注:内容来源于stack exchange,提问作者fasenderos

火山引擎 最新活动