曲径通幽论坛

标题: 关于获取用户 IP 地址(REMOTE_ADDR 和 HTTP_X_FORWARDED_FOR) [打印本页]

作者: beyes    时间: 2012-6-15 17:31
标题: 关于获取用户 IP 地址(REMOTE_ADDR 和 HTTP_X_FORWARDED_FOR)
可以使用 $_SERVER 数组中的 REMOTE_ADDR 来获取浏览当前页面的 IP 地址,比如下面代码:
[Plain Text] 纯文本查看 复制代码
<?php
        echo "Your IP Address : " . $_SERVER['REMOTE_ADDR'] . "<br>";
?>

用浏览器浏览时,可以看到:
[attach]632[/attach]
上面是在内网计算机直接访问内网的服务器。如果是通过路由器共享上网,那么得到的是路由器上的公网 IP,如:
[attach]633[/attach]

还有一个参数是 HTTP_X_FORWARDED_FOR 。如果用户使用的是代理服务器上网,那么一般可以通过这个参数获得代理服务器后的用户真实 IP,而不是代理服务器的 IP。修改上面的代码如下:
[PHP] 纯文本查看 复制代码
<?php
        echo "Your IP address : " . $_SERVER['REMOTE_ADDR'] . "<br>";
        echo "Your Real IP Address : " . $_SERVER['HTTP_X_FORWARDED_FOR'] . "<br>";
?>


下面在 IE 浏览器里添加一个 HTTP 代理服务器:
[attach]634[/attach]

现在用 IE 打开上面上面的 getip.php 页面,可以看到:
[attach]635[/attach]

上面,41.203.89.186 是代理服务器地址,它可以被  $_SERVER['REMOTE_ADDR'] 直接获得。而使用 $_SERVER['HTTP_X_FORWARDED_FOR'] 就可以获得隐藏在代理服务器背后你的真实 IP (或者说是你的路由器 IP,如果你是内网通过路由上网的话)。但是,使用 HTTP_X_FORWARDED_FOR 并不总是奏效,它仍然可能获取到的是代理服务器的 IP 。
作者: beyes    时间: 2012-6-17 02:55
标题: REMOTE_ADDR, HTTP_X_FORWARDED_FOR,HTTP_CLIENT_IP
下面讨论一下 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 ,那么容易被伪造所欺骗,但是更宽容些。




欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2