实际开发中我们经常会需要获取用户的ip地址,http的请求头X-Forwarded-For一般能为我们达到此目的。
X-Forwarded-For 请求头格式:(示例如下)
X-Forwarded-For: ip0, ip1, ip2
这个 就表示用户真实ip地址为ip0,然后经过ip1的代理和ip2的代理才请求过来的。最后一层的代理是没有在X-Forwarded-For中出现的,最后一层代理的ip地址可以通过 Remote Address 来获取,这个 Remote Address 是用于tcp三次连接的无法伪造。
结论:
- 直接对外提供服务的 Web 应用,在进行与安全有关的操作时,只能通过 Remote Address 获取 IP,不能相信任何请求头;
- 使用 Nginx 等 Web Server 进行反向代理的 Web 应用,在配置正确的前提下,要用 X-Forwarded-For 最后一节 或 X-Real-IP 来获取 IP(因为 Remote Address 得到的是 Nginx 所在服务器的内网 IP);同时还应该禁止 Web 应用直接对外提供服务;
- 在与安全无关的场景,例如通过 IP 显示所在地天气,可以从 X-Forwarded-For 靠前的位置获取 IP,但是需要校验 IP 格式合法性;
注意的地方
直接对外发布服务的话,用户是可以伪造X-Forwarded-For字段内容的,但是经过nginx这种服务器的转发加工处理(反向代理),一般都是可以通过nginx获取到真实ip地址(X-Forwarded-For字段的最后一节的内容)的。