下面讨论一下 REMOTE_ADDR, HTTP_X_FORWARDED_FOR 和 HTTP_CLIENT_IP 这几个参数的的异同。
REMOTE_ADDR 是浏览当前页面的用户计算机的 IP 地址,这个地址通过TCP 协议的 3 次握手时获得。如果是直接浏览,那么 REMOTE_ADDR 就是你自己计算机的 IP;如果你用的是代理服务器(匿名代理)来浏览网站,那么该参数获得的就是代理服务器的 IP 。
假如一个投票系统,假设一个 IP 只能投票一次,那么如果只用 REMOTE_ADDR 来判断 IP 来源,则可能躲在代理服务器后的许多计算机就只能有最先投票的那台计算机投的票是有效票,其它后来的投票者无法投票。
HTTP_CLIENT_IP 是直接客户端 IP,如果用户使用超级匿名代理,那么该选项返回 none 。这个选项可以被伪造,比如:
[Plain Text] 纯文本查看 复制代码 curl_setopt($ch, CURLOPT_HTTPHEADER, array('CLIENT-IP: 184.22.140.143'));
HTTP_X_FORWARDED_FOR 选项可以用来获取用户是在哪个 IP 上使用代理,该选项亦可伪造,比如下面语句:
[Plain Text] 纯文本查看 复制代码 curl_setopt($ch, CURLOPT_HTTPHEADER, array('X-FORWARDED-FOR: 202.140.210.27', 'CLIENT-IP: 184.22.140.143'));
如果在服务器端使用 $_SERVER['HTTP_CLIENT_IP'] 时获得的是 184.22.140.143 这个 IP。
如果用 $_SERVER['HTTP_X_FORWARDED_FOR'] 获得的是 202.140.210.27 这个 IP,也就是说服务器此时认为 202.140.210.27 这个 IP 是你那个躲在代理背后的计算机 IP 。
如果用 $_SERVER['REMOTE_ADDR'] 获得的是 “代理服务器IP” 或者是 “你自己计算机的IP“ 。
因此,使用 REMOTE_ADDR 的限制最为严格,但也会造成大量的误杀。如果判断 HTTP_CLIENT 或者 HTTP_X_FORWARDED_FOR ,那么容易被伪造所欺骗,但是更宽容些。 |