PHP5例分析与实现代码,获取客户端的真实IP地址
(1)但是,如果客户端使用代理服务器来访问它,它采取的是代理服务器的IP地址,而不是真正的客户端IP地址,通过代理服务器获取客户端真实IP地址,_server美元{http_x_forwarded_for}是用来读取。
(2)只有当客户端使用透明代理,为_server {http_x_forwarded_for 是客户端真实IP的价值。如果它是一个多层代理,该值可以由客户端的真正IP和多个代理服务器的IP组成,由逗号分隔。
(3)在匿名代理或欺骗代理的情况下,它是代理服务器的IP值。如果是多代理,该值可以由多个代理服务器的IP组成,用逗号分隔。
(4)在高匿名代理的情况下,它是空值。
至于在HTTP头信息remote_addr和http_forwarded_for值,分析如下,假设客户端真实IP是221.5.252.160:
首先,不要使用代理服务器的PHP来获取客户机IP情况:
复制代码如下:remote_addr = 221.5.252.160
http_via =不是数字或不显示
http_x_forwarded_for =没有价值或没有显示
两。使用透明代理服务器的情况:透明代理
复制代码如下:remote_addr =最后的代理服务器IP
http_via =代理服务器IP
http_x_forwarded_for =客户端真实IP(由多个代理服务器,这个值是相似的:221.5.252.160,203.98.182.163,203.129.72.215)
这种代理服务器仍然将客户端的真实IP发送给访问对象,不能隐藏真实身份。
三。使用普通匿名代理服务器的PHP获得客户端IP情况:匿名代理
复制代码代码如下所示:
remote_addr =最后的代理服务器IP
http_via =代理服务器IP
http_x_forwarded_for =代理服务器IP(当通过多个代理服务器,这个值是相似的:203.98.182.163,203.98.182.163,203.129.72.215)
在这种情况下,客户机的真正IP被隐藏,但它被显示给访问对象,客户机正在使用代理服务器访问它们。
四。使用欺骗性代理服务器:篡改代理
复制代码代码如下:remote_addr =代理服务器IP
http_via =代理服务器IP
http_x_forwarded_for =随机IP(由多个代理服务器,这个值是相似的:220.4.251.159,203.98.182.163,203.129.72.215)
在这种情况下,它也表明,客户端使用代理服务器,但发明了一种伪随机的IP(220.4.251.159)而不是客户端的真实IP欺骗。
五,使用高匿名代理服务器的PHP获得客户端IP情况:高匿名代理(精英代理)
复制代码代码如下:remote_addr =代理服务器IP
http_via =不是数字或不显示
http_x_forwarded_for =没有价值或没有显示。
无论remote_addr或http_forwarded_for,这些头信息可能无法得到它,因为不同的浏览器会发送不同的IP报头信息,不同的网络设备。所以用PHP使用$ _server {remote_addr}得到的值_server美元{http_x_forwarded_for}可以是空值或未知的价值。
PHP获取客户端IP的另一点是注意利用函数getenv('http_x_forwarded_for)或getenv('remote_addr)也可以达到同样的效果的代码。但getenv()不支持在IIS的ISAPI模式运行PHP。
remote_addr是IP时,你的客户握手服务器。如果一个匿名代理使用,remote_addr将显示代理服务器的IP。
http_client_ip由代理服务器发送的HTTP头。如果它是一个超级匿名代理,无返回值。以同样的方式,remote_addr将由代理服务器IP更换。
_server美元{ 'remote_addr}; / /接入终端(有可能是用户,有可能是IP代理)
_server美元{ 'http_client_ip}; / /代理(可能伪造)
_server美元{ 'http_x_forwarded_for}; / /在用户正在使用的IP代理(可能存在,可以锻造)
PHP代码编写如下案例:
复制代码代码如下所示:
< PHP
功能getip(){
未知的=未知的;
如果(isset($ _server { 'http_x_forwarded_for ' }){ } _server美元的'http_x_forwarded_for strcasecmp(_server 'http_x_forwarded_for'} {美元,美元未知)){
IP = _server美元美元'http_x_forwarded_for'} {;
}
elseif(isset($ _server { 'remote_addr ' }){ } _server美元的'remote_addr strcasecmp(_server 'remote_addr'} {美元,美元未知)){
IP = _server美元美元'remote_addr'} {;
}
}
>