HTTP协议定义了很多头部参数,这些参数由请求的发起方和响应方设置,所以头部参数可以分为请求头和响应头,通信双方(浏览器和服务器)会去读取这些头部参数并做出对应的的动作。如果有人不按协议设置这些参数,就可以达到一些非法的目的。

X-Forwarded-For起源

xxf这个请求头,很多应用层在使用,所以这里必须要了解他的意义。X代表这是一个扩展的头参数。事实也正是如此,最开始xxf是Squid cache这个缓存代理服务软件自定义的一个头部参数,用来标识请求的源IP。后来,xxf的使用范围越来越广泛,被各种HTTP代理软件,负载均衡软件采用,HTTP标准就将xxf写入RFC 7239(Forwarded HTTP Extension)标准之中。自此,xxf就转正了。

X-Forwarded-For格式

现在的网络拓扑结构不再简单,一个请求从发起到服务端收到,往往会经历很多代理服务,这个时候,源IP的定义就不再简单,xxf规定其值是一个列表,列表元素用逗号分割,从左往右依次是HTTP请求出发到终点经历的转发节点IP。假设一个HTTP请求经历的节点是浏览器,代理1,代理2,代理3,那么xxf的值将会是,源IP,代理1的IP,代理2的IP。没错,没有代理3的IP,因为每一个节点都只能添加他的下游节点。所以你在浏览器上并不会看到请求会带着xxf,浏览器一般是源IP,他不必添加xxf。所以xxf请求头是一个服务转发使用的请求头。

X-Forwarded-For: 源IP,代理1的IP,代理2的IP

这就要求每一个代理服务按照约定追加请求他的节点的IP到请求头xxf。代理服务器都会提供这种配置功能。如果某些代理服务不按约定做,或是做错了,那么xxf就会失去了他应有的语义。如果服务方通过获取xxf中IP来校验是否是允许请求的白名单,这就是一个漏洞,因为xxf只是一个展示参数,完全依赖代理服务的自觉性,所以依赖xxf做IP检验的安全系数并不高。

Remote_Addr

ra也是一个转发请求时定义的请求头参数,