REMOTE_ADDR、HTTP_X_FORWARDED_FOR、UserHostAddress获取 IP 地址的区别详解
发布时间:2021/12/16 16:09:49 作者:Admin 阅读:1510
广告:阿里云采购优惠专区
REMOTE_ADDR 是离服务器“最近”的 IP。
没有使用代理时,也就是客户端 IP。
使用一层代理时,也就是代理的 IP。
使用多层代理时,也就是最近一个(最靠近服务器)的代理的 IP。
HTTP_X_FORWARDED_FOR 是从客户端到 REMOTE_ADDR 前一个 IP。
没有使用代理时,没有值。
使用一层代理时,也就是客户端 IP。
使用二层代理时,也就是“客户端IP,1层代理IP”,也就是相当于 IP 路径,中间用逗号隔开,注意不包括二层代理。
使用三层代理时,也就是“客户端IP,1层代理IP,2层代理”,也就是相当于 IP 路径,中间用逗号隔开,注意不包括三层代理。
……
注意:HTTP_X_FORWARDED_FOR 是 HTTP 头的一部分,就像 HTTP_REFERER 一样,是可以伪造的。这就造成一种情况,并没有使用代理,我们却认为使用了代理,而忽略了 REMOTE_ADDR 对应的是真实 IP。所以如果是做安全方面的记录,最好把 REMOTE_ADDR、HTTP_X_FORWARDED_FOR 二者的值都记录下来。
使用三层代理时经过的ip:
HTTP_X_FORWARDED_FOR (userrealip,dai1ip,dai2ip) + REMOTE_ADDR (dai3ip)
REMOTE_ADDR=Request.UserHostAddress
为了防止HTTP_X_FORWARDED_FOR伪造,又防止获取到的REMOTE_ADDR是反向代理服务器(nginx)的ip,可以从右向左取HTTP_X_FORWARDED_FOR第一个值:
string[] splitter = { "," }; string[] IP_Array = User_IPAddressRange.Split(splitter, System.StringSplitOptions.None); int LatestItem = IP_Array.Length - 1; User_IPAddress = IP_Array[LatestItem];
广告:阿里云新人采购专场
相关文章