特殊的Header头——X-Forwarded-For 与 X-Real-IP 学习
·
特殊的Header头
X-Forwarded-For
和
X-Real-IP
只有请求存在dai li时才有值
X-Forwarded-For
记录dai li 服务器的地址,每经过一个dai li,该字段会加上一个记录,由于是记录来源地址,所以该字段不会保存最后一个dai li 服务器的地址
- 存储客户端 ip 和反向 dai li IP 列表,以逗号+空格分隔
- 记录最后直连实际服务器之前的整个 dai li 过程
- 可能会被伪造 ip,但是直连实际服务器这段不会被伪造
图示:
可以看到,第一层 dai li ,其存储了客户端的 IP,第二层 dai li 追加了 第一层的dai li 的IP(proxy_ip1),但并没有保存自己的proxy_ip2。
X-Real-IP
也是用来记录服务器的地址,但是和上面的不同,它不把记录添加到结尾,而是直接替换。
- 请求实际服务器的 IP
- 每过一层 dai li 都会被覆盖掉,只需第一层设置 dai li
- IP可以被伪造,但如果存在一级以上的 dai li,它就不会收到影响,因为每经过一次dai li,它就会被覆盖
图示:
第一层 dai li 已经拿到了真实的 ip,并在 header 中设置了 X-Real-IP,因此第二层 dai li 不需要再去设置 X-Real-IP,只需要做转发就可以
remote_addr
表示上一个客户端连接的地址,不存在 dai li 就表示客户端的地址,存在 dai li 就表示最后一个 dai li 服务器的地址
remote_addr
无法伪造,remote_addr
字段不是通过请求头来决定的,而是服务端在建立tcp连接时获取的的客户端地址
可以这样理解,因为建立 TCP 连接需要三次握手,如果伪造了源 IP,无法建立 TCP 连接,更不会有后面的 HTTP 请求
Go 中可以通过 req.RemoteAddr
代码获取请求地址的 ip,
End-to-end 和 Hop-by-hop
End-to-end 端到端头部
- 此类头部字段会转发给 请求/响应 的最终接收目标。
- 必须保存在由缓存生成的响应头部。
- 必须被转发。
Hop-by-hop 逐跳首部
- 此类头部字段只对单次转发有效。会因为转发给缓存dai li 服务器而失效。
- HTTP 1.1 版本之后,如果要使用 Hop-by-hop 头部字段则需要提供 Connection 字段。
除了一下 8 个字段为逐跳字段,其余均为端到端字段。
- Connection
- Keep-Alive
- Proxy-Authenticate
- Proxy-Authenrization
- Trailer
- TE
- Tranfer-Encoding
- Upgrade
其他 header 头
- Connection——标记请求连接是长连接还是短连接,或者说已关闭;http1.1 后默认是从长连接,该字段的值为:keep-alive
- TE——HTTP 请求头字段,传输编码的优先级,固定值:TE: trailers,deflate
- Trailer——HTTP 响应头字段,用户说明传输中分块编码的编码信息,固定值 Trailer: Max-Forwards
更多推荐
已为社区贡献1条内容
所有评论(0)