客户端经过代理机器访问,或者 Nginx 转发后,都会导致无法通过 request.getRemoteAddr() 获取真实 IP。
无法获取真实 IP 会导致对访问请求判断不准确,如判断用户异地登录风险、防止重复刷票等。
代理机器转发后,一般会在 x-forwarded-for 中记录来源 IP,如有多级代理可能会有多个。格式如下
X-Forwarded-For: client1, proxy1, proxy2
获取真实 IP 代码如下:
public String getClientIp(HttpServletRequest request) { String xff = request.getHeader("X-Forwarded-For"); if (xff == null) { return request.getRemoteAddr(); } else { return xff.contains(",") ? xff.split(",")[0] : xff; } }
伪造 X-Forwarded-For
由于是从 header 中获取 IP,攻击者可以在请求中直接传 X-Forwarded-For 来伪造 IP。可以通过 Nginx 配置 $remote_addr 来强行覆盖伪造数据,格式如下
proxy_set_header X-Forwarded-For $remote_addr;
$remote_addr 是 TCP 连接的客户端 IP,是无法被伪造的。但是也导致请求到达 Nginx 之前的所有代理信息都被抹掉,无法为真正使用代理的用户提供更好的服务。
本文来源:程序之心,转载请注明出处!
最新内容
© 2016 - 2024 chengxuzhixin.com All Rights Reserved.