HTTP请求头中表示代理IP地址的属性及获取情况
<p>博客:https://www.emanjusaka.com</p><p>公众号:emanjusaka的编程栈</p>
<blockquote>
<p>by emanjusaka fromhttps://www.emanjusaka.com/archives/http-proxy-ip</p>
<p>本文为原创文章,可能会更新知识点以及修正文中的一些错误,全文转载请保留原文地址,避免产生因未即时修正导致的误导。</p>
</blockquote>
<h2 id="代理服务器类型">代理服务器类型</h2>
<h3 id="透明代理服务器transparent-proxies">透明代理服务器(Transparent Proxies)</h3>
<p>透明代理,也称为内联代理、拦截代理或强制代理,是一种位于最终用户或设备与互联网之间的服务器,可拦截所有请求和响应而不对其进行更改。</p>
<p>术语“透明”是指代理的操作对用户不可见;它不会修改请求或响应的内容,也不需要对用户的设备进行任何配置更改。这使得它不同于非透明代理,非透明代理可能需要在客户端设备上进行明确配置或修改通过它们的数据。</p>
<h3 id="普通匿名代理服务器anonymous-proxies">普通匿名代理服务器(Anonymous Proxies)</h3>
<p>普通匿名代理同样可以隐藏用户的IP地址,但与高匿名代理相比不同的是普通匿名代理会改变用户的访问请求,这样的话站点服务器便有很大概率会识别出用户使用了代理。</p>
<p>匿名代理隐藏了您的真实IP,但是向访问对象可以检测是使用代理服务器访问他们的。会改变我们的请求信息,服务器端有可能会认为我们使用了代理。不过使用此种代理时,虽然被访问的网站不能知道你的ip地址,但仍然可以知道你在使用代理,当然某些能够侦测ip的网页也是可以查到你的ip。</p>
<h3 id="欺骗性代理服务器distorting-proxies">欺骗性代理服务器(Distorting Proxies)</h3>
<p>欺骗性代理是指代理服务器通过修改HTTP标头来掩盖客户端的IP地址,并向目标服务器呈现一个虚假的IP地址。</p>
<p>它通常用于增强隐私、添加匿名层并限制监视用户浏览活动的能力。</p>
<h3 id="高匿名代理服务器high-anonymity-proxies">高匿名代理服务器(High Anonymity Proxies)</h3>
<p>高匿名代理不改变客户机的请求,这样在服务器看来就像有个真正的客户浏览器在访问它,这时客户的真实IP是隐藏的,完全用代理服务器的信息替代了您的所有信息,就象您就是完全使用那台代理服务器直接访问对象,同时服务器端不会认为我们使用了代理。</p>
<h2 id="请求头中表示代理-ip-地址的属性">请求头中表示代理 IP 地址的属性</h2>
<h3 id="remote_addr">REMOTE_ADDR</h3>
<p>在没有使用代理服务器的情况下,<code>REMOTE_ADDR</code>会显示用户的真实IP地址。</p>
<p>如果使用了代理服务器,<code>REMOTE_ADDR</code>会显示最后一个代理服务器的IP地址。</p>
<h3 id="http_x_forwarded_for">HTTP_X_FORWARDED_FOR</h3>
<p><code>HTTP_X_FORWARDED_FOR</code>是一个 HTTP 请求头字段。它主要用于记录客户端的真实 IP 地址,在经过代理服务器或负载均衡器等中间设备转发请求时发挥重要作用。</p>
<p><code>HTTP_X_FORWARDED_FOR</code>主要是在服务器端代码中,当使用某些特定的服务器端编程语言或框架(比如在 PHP 中通过<code>$_SERVER['HTTP_X_FORWARDED_FOR']</code>这种方式)去获取对应请求头信息时才会用到的名称。</p>
<p>也就是说,它是在服务器端内部代码层面针对X-Forwarded-For请求头进行读取操作时的一种转换后的、适配特定环境的命名。</p>
<h3 id="http_client_ip">HTTP_CLIENT_IP</h3>
<p><code>HTTP_CLIENT_IP</code> 是一个环境变量,它通常用于在服务器端获取发起 HTTP 请求的客户端的 IP 地址。</p>
<p>它并不是一个标准的 HTTP 请求头部(header),而是一个在服务器端环境中可能被设置的变量。</p>
<h3 id="wl-proxy-client-ip">WL-Proxy-Client-IP</h3>
<p>它用于表示通过 WebLogic Server(WL)代理的客户端的原始 IP 地址。</p>
<p>当客户端通过代理服务器访问 WebLogic 应用时,代理服务器会添加这个头部信息,以便应用服务器能够识别真正发起请求的客户端 IP 地址。</p>
<h3 id="proxy-client-ip">Proxy-Client-IP</h3>
<p><code>Proxy-Client-IP</code> 类似于 <code>X-Real-IP</code>,也是一个非标准的 HTTP 请求头部(header),用于在 HTTP 请求通过代理服务器转发到后端服务器时,向后端服务器传递原始客户端的 IP 地址。</p>
<p>这个头部并不是 HTTP 协议标准的一部分,而是由某些代理服务器或负载均衡器自定义添加的,以便后端服务器能够识别出原始请求的发起者。</p>
<h3 id="x-real-ip">X-Real-IP</h3>
<p><code>X-Real-IP</code> 是一个 HTTP 请求头部(header),用于识别通过 HTTP 代理或负载均衡器转发到后端服务器的原始客户端 IP 地址。</p>
<p>与 <code>X-Forwarded-For</code> 不同,``X-Real-IP` 通常只包含单个 IP 地址,即发起请求的客户端的真实 IP 地址。</p>
<p>对于支持 <code>X-Forwarded-For</code> 的代理服务器,它们通常会同时设置 <code>X-Forwarded-For</code> 和 <code>X-Real-IP</code> 头部。</p>
<p>在这种情况下,<code>X-Forwarded-For</code> 头部会包含完整的请求链中的 IP 地址列表,而 <code>X-Real-IP</code> 头部则只包含客户端的原始 IP 地址。这可以为后端服务器提供更多的上下文信息,以便进行更准确的访问控制和日志记录。</p>
<h3 id="x-forwarded-for">X-Forwarded-For</h3>
<p><code>X-Forwarded-For</code> 头部通常包含一个或多个 IP 地址,它们用逗号分隔。</p>
<p>第一个 IP 地址通常是发起请求的客户端的 IP 地址,随后的 IP 地址则代表请求所经过的代理或负载均衡器的 IP 地址。</p>
<p>例如,如果一个请求从客户端 IP 192.168.1.100 发出,并通过一个代理服务器 IP 192.168.2.1 转发到目标 web 服务器,那么 <code>X-Forwarded-For</code> 头部可能看起来像这样:</p>
<pre><code class="language-json">X-Forwarded-For: 192.168.1.100, 192.168.2.1
</code></pre>
<h2 id="获取ip地址的几种情况">获取IP地址的几种情况</h2>
<p>X-Forwarded-For 和 HTTP_X_FORWARDED_FOR的情况基本上是一样的。</p>
<p>如果有多级代理,HTTP_X_FORWARDED_FOR / X-Forwarded-For 会包含一个 IP 地址列表,从左到右依次表示:</p>
<ul>
<li>
<p>最左边:客户端的真实 IP。</p>
</li>
<li>
<p>中间:经过的代理服务器的 IP。</p>
</li>
<li>
<p>最右边:直接向目标服务器发起请求的代理 IP。</p>
</li>
</ul>
<h3 id="没有使用代理服务器的情况">没有使用代理服务器的情况</h3>
<ul>
<li>REMOTE_ADDR:真实 IP 地址</li>
<li>HTTP_VIA:空</li>
<li>HTTP_X_FORWARDED_FOR:空</li>
</ul>
<pre><code class="language-plaintext">REMOTE_ADDR: 192.168.1.100
HTTP_VIA:
HTTP_X_FORWARDED_FOR:
</code></pre>
<h3 id="使用透明代理服务器的情况">使用透明代理服务器的情况</h3>
<ul>
<li>REMOTE_ADDR:代理服务器 IP</li>
<li>HTTP_VIA:可能会包含代理服务器的信息</li>
<li>HTTP_X_FORWARDED_FOR:真实 IP 地址</li>
</ul>
<pre><code class="language-plaintext">REMOTE_ADDR: 203.0.113.1(代理服务器的 IP 地址)
HTTP_VIA: 1.1 ProxyServer (说明请求经过了代理)
HTTP_X_FORWARDED_FOR: 192.168.1.100 (客户端的真实 IP 地址)
</code></pre>
<h3 id="使用普通匿名代理服务器的情况">使用普通匿名代理服务器的情况</h3>
<ul>
<li>REMOTE_ADDR:代理服务器 IP</li>
<li>HTTP_VIA:可能会包含代理服务器的信息</li>
<li>HTTP_X_FORWARDED_FOR:客户端的真实 IP 地址,但代理服务器可能会将这部分信息隐藏或替换为一个通用的 IP 地址。</li>
</ul>
<pre><code class="language-plaintext">REMOTE_ADDR: 203.0.113.1(代理服务器的 IP 地址)
HTTP_VIA: 1.1 ProxyServer (说明请求经过了代理)
HTTP_X_FORWARDED_FOR: 203.0.113.1 (代理服务器的 IP 地址)
</code></pre>
<h3 id="使用欺骗性代理服务器的情况">使用欺骗性代理服务器的情况</h3>
<ul>
<li>REMOTE_ADDR:代理服务器 IP</li>
<li>HTTP_VIA:可能会包含代理服务器的信息,但可能经过修改以隐藏其真实身份。</li>
<li>HTTP_X_FORWARDED_FOR:可能包含一些毫无意义的或者伪造的 IP 信息,比如一个随机生成的 IP 地址9.9.9.9,这完全是为了误导目标服务器而设置的。</li>
</ul>
<pre><code class="language-plaintext">REMOTE_ADDR: 203.0.113.1(代理服务器的 IP 地址)
HTTP_VIA: 1.1 ProxyServer (说明请求经过了代理)
HTTP_X_FORWARDED_FOR: 198.51.100.1 (伪造的 IP 地址)
</code></pre>
<h3 id="使用高匿名代理服务器的情况">使用高匿名代理服务器的情况</h3>
<ul>
<li>REMOTE_ADDR:代理服务器 IP</li>
<li>HTTP_VIA:可能会包含代理服务器的信息,但很难通过这个信息追踪到代理服务器的真实身份。</li>
<li>HTTP_X_FORWARDED_FOR:为空或者不包含用户真实 IP 相关线索。与透明代理不同,高匿名代理不会通过这个字段泄露用户的真实 IP。</li>
</ul>
<pre><code class="language-plaintext">REMOTE_ADDR: 203.0.113.1(代理服务器的 IP 地址)
HTTP_VIA:
HTTP_X_FORWARDED_FOR:
</code></pre>
<blockquote>
<p>谦学于心,谷纳万物,静思致远,共筑收获之旅!</p>
<p>原文地址: https://www.emanjusaka.com/archives/http-proxy-ip</p>
</blockquote><br><br>
来源:https://www.cnblogs.com/emanjusaka/p/-/http-proxy-ip 哇,辛苦了!整理了这么详细的关于代理IP和HTTP请求头的知识点,收藏了!
之前在做项目的时候确实经常遇到获取用户真实IP的问题,特别是网站用了CDN或者负载均衡的时候。那时候为了获取真实IP,真是踩了不少坑。
想请教一下楼主,现在很多网站都用上了CDN加速,如果要获取访客的真实IP,是不是主要就得靠X-Forwarded-For这个头?但是又担心这个头可以被伪造,安全性上有什么好的建议吗?
另外看到文章里提到了高匿名代理,这个在实际应用中是不是很难检测到?有没有什么好的方法可以识别出是否使用了高匿名代理?
感觉这篇文章很实用,对于做Web安全或者反爬虫的朋友应该很有帮助。支持下![强]
頁:
[1]