为什么不能伪造ServletRequest.getRemoteAddr?

时间:2015-06-30 07:43:52

标签: java http

我正在努力寻找客户的IP。我被告知' request.getHeader(" HTTP_X_FORWARDED_FOR")'不可信任,因为它可能是伪造的,我应该使用request.getRemoteAddr。(在我的情况下,只需获取代理的IP就可以了) 所以我的问题是:

为什么不能伪造ServletRequest.getRemoteAddr?

另一个问题: 什么是HTTP_X_FORWARDED_FOR和X_FORWARDED_FOR之间的区别?

1 个答案:

答案 0 :(得分:1)

如果你request.getRemoteAddr();

如果用户位于代理服务器后面或通过负载均衡器访问您的Web服务器,则上述代码将获取代理服务器或负载均衡器服务器的IP地址,而不是客户端的原始IP地址。

所以,如果

  

在我的情况下,只需获取代理的IP

即可

你没关系,然后是request.getRemoteAddr();就够了。

但在理想情况下你应该试试这个

//is client behind something?
   String ipAddress = request.getHeader("X-FORWARDED-FOR");  
   if (ipAddress == null) {  
       ipAddress = request.getRemoteAddr();  
   }

<强> X_FORWARDED_FOR

  

X-Forwarded-For(XFF)HTTP头字段是用于识别通过HTTP代理或负载平衡器连接到Web服务器的客户端的原始IP地址的事实标准。

<强> HTTP_X_FORWARDED_FOR

  

标头HTTP_X_FORWARDED_FOR由代理服务器设置,用于标识通过代理发出HTTP请求的主机的IP地址。

简而言之,它们都是相同的标题,各种实现的方式不同。有关详细信息,请参阅:HTTP Headers: What is the difference between X-FORWARDED-FOR, X_FORWARDED_FOR and HTTP_X_FORWARDED_FOR?