首先了解一些HTTP代理的相关知识.
使用不同种类代理服务器,情况会有所不同:
一、没有使用代理服务器的情况:
REMOTE_ADDR = 您的 IP
HTTP_VIA = 没数值或不显示
HTTP_X_FORWARDED_FOR = 没数值或不显示
二、Transparent Proxies,使用透明代理服务器的情况:
REMOTE_ADDR = 代理服务器 IP
HTTP_VIA = 代理服务器 IP
HTTP_X_FORWARDED_FOR = 您的真实 IP
这类代理服务器还是将您的信息转发给您的访问对象,无法达到隐藏真实身份的目的。
三、Anonymous Proxies,使用普通匿名代理服务器的情况:
REMOTE_ADDR = 代理服务器 IP
HTTP_VIA = 代理服务器 IP
HTTP_X_FORWARDED_FOR = 代理服务器 IP
隐藏了您的真实IP,但是向访问对象透露了您是使用代理服务器访问他们的。
四、Distorting Proxies,使用欺骗性代理服务器的情况:
REMOTE_ADDR = 代理服务器 IP
HTTP_VIA = 代理服务器 IP
HTTP_X_FORWARDED_FOR = 随机的 IP
告诉了访问对象您使用了代理服务器,但编造了一个虚假的随机IP代替您的真实IP欺骗它。
五、使用高匿名代理服务器的情况:High Anonymity Proxies (Elite proxies)
REMOTE_ADDR = 代理服务器 IP
HTTP_VIA = 没数值或不显示
HTTP_X_FORWARDED_FOR = 没数值或不显示
<?php /** * get the real IP * * @Author: * @Return: string */ function getIP() { static $realip; if (isset($_SERVER)){ if (isset($_SERVER["HTTP_X_FORWARDED_FOR"])){ $realip = $_SERVER["HTTP_X_FORWARDED_FOR"]; } else if (isset($_SERVER["HTTP_CLIENT_IP"])) { $realip = $_SERVER["HTTP_CLIENT_IP"]; } else { $realip = $_SERVER["REMOTE_ADDR"]; } } else { if (getenv("HTTP_X_FORWARDED_FOR")){ $realip = getenv("HTTP_X_FORWARDED_FOR"); } else if (getenv("HTTP_CLIENT_IP")) { $realip = getenv("HTTP_CLIENT_IP"); } else { $realip = getenv("REMOTE_ADDR"); } } return $realip; } ?>
在PHP中我们可以用$_SERVER["REMOTE_ADDR"]来获取用户客户端的IP地址,但如果客户端是使用代理服务器,
那取到的就是代理服务器的 IP 地址.
要想透过代理服务器取得客户端的真实 IP 地址,就要使用$_SERVER["HTTP_X_FORWARDED_FOR"] 来读取.
但并不是用$_SERVER["HTTP_X_FORWARDED_FOR"]都能来读取到透过代理服务器的客户真实 IP,有些用此方法读取到的仍然是代理服务器的 IP.
建议不要使用HTTP_X_FORWARDED_FOR,这会提供机会让访问者伪造ip,而变得难易查询.
references:
http://czy4411741.blog.163.com/blog/static/34203127201021022857899/
http://hi.baidu.com/hengcheng/blog/item/2dc020fa65c9278d9e5146b4.html