【HTTP协议系列4】服务器日志之X_Forwarded_For
来源:互联网 发布:淘宝登录名可以修改吗 编辑:程序博客网 时间:2024/06/18 07:18
X_Forwarded_For
X-Forwarded-For:简称XFF头,它代表客户端,也就是HTTP的请求端真实的IP,只有在通过了HTTP代理或者负载均衡服务器时才会添加该项。HTTP/1.1(RFC 2616)协议并没有对它的定义,它最开始是由 Squid 这个缓存代理软件引入,用来表示 HTTP 请求端真实 IP。如今它已经成为事实上的标准,被各大 HTTP 代理、负载均衡等转发服务广泛使用,并被写入 RFC 7239(Forwarded HTTPExtension)标准之中。
当今多数缓存服务器的使用者为大型ISP,为了通过缓存的方式来降低他们的外部带宽,他们常常通过鼓励或强制用户使用代理服务器来接入互联网。有些情况下,这些代理服务器是透明代理,用户甚至不知道自己正在使用代理上网。
如果没有XFF或者另外一种相似的技术,所有通过代理服务器的连接只会显示代理服务器的IP地址(而非连接发起的原始IP地址),这样的代理服务器实际上充当了匿名服务提供者的角色,如果连接的原始IP地址不可得,恶意访问的检测与预防的难度将大大增加。XFF的有效性依赖于代理服务器提供的连接原始IP地址的真实性。因此,XFF的有效使用应该保证代理服务器是可信的,比如可以通过建立可信服务器白名单的方式。
这一HTTP头一般格式如下:
X-Forwarded-For: client, proxy1, proxy2
可以看到,XFF 的内容由「英文逗号 + 空格」隔开的多个部分组成,最开始的是离服务端最远的设备 IP,然后是每一级代理设备的 IP。
如果一个 HTTP 请求到达服务器之前,经过了三个代理 Proxy1、Proxy2、Proxy3,IP 分别为 IP1、IP2、IP3,用户真实 IP 为 IP0,那么按照 XFF 标准,服务端最终会收到以下信息:X-Forwarded-For: IP0, IP1, IP2
反向代理
通常网站为了支撑更大的访问量,会增加很多web服务器,并在这些服务器前面增加一个反向代理(如HAProxy),它可以把负载均匀的分布到这些机器上。你的浏览器访问的首先是这台反向代理,它再把你的请求转发到后面的web服务器,这就使得web服务器会把remote_addr设为这台反向代理的IP,为了能让你的程序获取到真实的客户端IP,你需要给反向代理服务器(HAProxy)增加以下配置:
option forwardfor
它的作用就像上面说的,增加一个x_forwarded_for的头信息,把你上网机器的ip添加进去
五种情况
一、没有使用代理服务器的情况:
REMOTE_ADDR = 您的IP
HTTP_VIA = 没数值或不显示
HTTP_X_FORWARDED_FOR = 没数值或不显示
二、使用透明代理服务器的情况:Transparent Proxies
REMOTE_ADDR = 最后一个代理服务器IP
HTTP_VIA = 代理服务器 IP
HTTP_X_FORWARDED_FOR = 您的真实 IP,经过多个代理服务器时,这个值类似如下:203.98.182.163,203.98.182.163, 203.129.72.215。
这类代理服务器还是将您的信息转发给您的访问对象,无法达到隐藏真实身份的目的。
三、使用普通匿名代理服务器的情况:Anonymous Proxies
REMOTE_ADDR = 最后一个代理服务器IP
HTTP_VIA = 代理服务器 IP
HTTP_X_FORWARDED_FOR = 代理服务器 IP,经过多个代理服务器时,这个值类似如下:203.98.182.163,203.98.182.163, 203.129.72.215。
隐藏了您的真实IP,但是向访问对象透露了您是使用代理服务器访问他们的。
四、使用欺骗性代理服务器的情况:Distorting Proxies
REMOTE_ADDR = 代理服务器IP
HTTP_VIA = 代理服务器IP
HTTP_X_FORWARDED_FOR = 随机的 IP,经过多个代理服务器时,这个值类似如下:203.98.182.163,203.98.182.163, 203.129.72.215。
告诉了访问对象您使用了代理服务器,但编造了一个虚假的随机IP代替您的真实IP欺骗它。
五、使用高匿名代理服务器的情况:High Anonymity Proxies (Elite proxies)
REMOTE_ADDR = 代理服务器IP
HTTP_VIA = 没数值或不显示
HTTP_X_FORWARDED_FOR = 没数值或不显示
完全用代理服务器的信息替代了您的所有信息,就象您就是完全使用那台代理服务器直接访问对象。
基于以上介绍,可以采用的一些安全策略:
1. 代理IP识别:
1)根据XFF;
2)根据一段时间ip(remote_addr和XFF中)出现的次数;
2. 基于代理IP的恶意IP识别:
1)如果XFF为空,即针对上述情况一和五:此时,如果remote_addr显示的ip在代理ip库中,则该请求是高匿名代理访问,该代理ip添加标注“高匿名ip”;
2)如果XFF有值,并且remote_addr不在XFF中不同,则remote_addr为“代理ip”,而XFF中ip不好判断是随机ip还是真实ip。
参考:
http://baike.baidu.com/link?url=Pt83O09KfqFbiRjXv53yXCMlGW1TACG-ZIHFclt6_vkfY1rU9oJLi0y0Ad830_SwwnKfmwkB16VHjVuFBBKhfa
http://blog.pengqi.me/2013/04/20/remote-addr-and-x-forwarded-for/
http://blog.csdn.net/kfanning/article/details/8277153
《HTTP 请求头中的 X-Forwarded-For》https://imququ.com/post/x-forwarded-for-header-in-http.html
===================================================================================================
补充:
识别一个IP是不是代理IP,技术不外乎就是如下四种:
- 反向探测技术:扫描IP是不是开通了80,8080等代理服务器经常开通的端口,显然一个普通的用户IP不太可能开通如上的端口。
- HTTP头部的X_Forwarded_For:开通了HTTP代理的IP可以通过此法来识别是不是代理IP;如果带有XFF信息,该IP是代理IP无疑。
- Keep-alive报文:如果带有Proxy-Connection的Keep-alive报文,该IP毫无疑问是代理IP。
- 查看IP上端口:如果一个IP有的端口大于10000,那么该IP大多也存在问题,普通的家庭IP开这么大的端口几乎是不可能的。
- 【HTTP协议系列4】服务器日志之X_Forwarded_For
- 协议系列之HTTP协议
- 应用层协议实现系列(二)——HTTP服务器之http协议解析
- MTK HTTP 协议之日志写入
- HTTP协议分析系列------http协议之refer防盗链
- http协议学习系列之基础篇
- 嵌入式Web服务器学习之HTTP协议
- 03.HTTP协议之服务器实现
- HTTP Web服务器研究之二 HTTP协议
- http协议学习系列
- http协议学习系列
- http协议学习系列
- http协议学习系列
- http协议学习系列
- http协议学习系列
- http协议学习系列
- http协议学习系列
- http协议学习系列
- 用Excel表格裁剪圆角图片
- 线程的基本介绍
- 最佳启动Acitivity
- iOS 后台 播放h5 视频、音频 解决方案
- 处理机调度避免死锁之银行家算法
- 【HTTP协议系列4】服务器日志之X_Forwarded_For
- STL迭代器简介
- redhat7安装mysql-server(mysqld)
- Keil编译错误error:L6050U
- ios面向切面AOP(下) swift版本
- sicily 1209. Sequence Sum Possibi
- Java中使用AES加密的简单示例
- 3Sum Closest
- opencv实现图像细化效果