登录 |  注册 |  繁體中文


获取用户Ip的安全隐患

分类: php 颜色:橙色 默认  字号: 阅读(2059) | 评论(0)

分析过程

这个来自一些项目中,获取用户Ip,进行用户操作行为的记录,是常见并且经常使用的。 一般朋友,都会看到如下通用获取IP地址方法。

function getIP() { 
	if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { 
		$realip = $_SERVER['HTTP_X_FORWARDED_FOR']; 
	} elseif (isset($_SERVER['HTTP_CLIENT_IP'])) { 
		$realip = $_SERVER['HTTP_CLIENT_IP']; 
	} else { 
		$realip = $_SERVER['REMOTE_ADDR']; 
		} 
		return $realip; 
	}

		 
		

这个是网上常见获取,ip函数,用这些值获取IP,我们首先要弄清楚,这些数据是从那个地方传过来的。

  • IP获取来源

1.’REMOTE_ADDR’  是远端IP,默认来自tcp 连接时,客户端的Ip。可以说,它最准确,确定是,只会得到直接连服务器客户端IP。如果对方通过代理服务器上网,就发现。获取到的是代理服务器IP了。

如:a->b(proxy)->c  ,如果c 通过’REMOTE_ADDR’ ,只能获取到b的IP,获取不到a的IP了。

 

2.’HTTP_X_FORWARDED_FOR’,’HTTP_CLIENT_IP’ 为了能在大型网络中,获取到最原始用户IP,或者代理IP地址。对HTTP协议进行扩展。定义了实体头。

HTTP_X_FORWARDED_FOR = clientip,proxy1,proxy2  所有IP用”,”分割。 HTTP_CLIENT_IP 在高级匿名代理中,这个代表了代理服务器IP。既然是http协议扩展一个实体头,并且这个值对于传入端是信任的,信任传入方按照规则格式输入的。以下以x_forword_for例子加以说明,正常情况下,这个值变化过程。

image

 

  • 分析风险点:

通过刚刚分析我们发现,其实这些变量,来自http请求的:x-forword-for字段,以及client-ip字段。 正常代理服务器,当然会按rfc规范来传入这些值。但是,当一个用户直接构造该x-forword-for值,发送给用户用户,那将会怎么样呢?

image图(1)

第2步,修改x-forword-fox值,我们看看结果

image

 

第三步,我们再修改下看看会怎么样?

image

 

总结:目前来说,获取ip并没有完美的方法,

1. 通过REMOTE_ADDR 来获取,得到的数据最准确,而且无法伪造,缺点是用户代理上网,获取的是代理ip地址。

2. 通过上面说的常用方法(HTTP_X_FORWARDED_FOR,HTTP_CLIENT_IP)获取,理论上可以获取真实ip,缺点是用户可以伪造ip。

 

 




姓 名: *
邮 箱:
内 容: *
验证码: 点击刷新 *   

回到顶部