获取用户Ip地址通用方法与常见安全隐患(HTTP_X_FORWARDED_FOR)

2015-01-24信息快讯网

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

分析过程
这个来自一些项目中,获取用户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了。

另外:该IP想篡改将很难实现,在传递知道生成php server值,都是直接生成的。

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例子加以说明,正常情况下,这个值变化过程。

获取用户Ip地址通用方法与常见安全隐患(HTTP_X_FORWARDED_FOR)_信息快讯网


分析Bug风险点:

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

获取用户Ip地址通用方法与常见安全隐患(HTTP_X_FORWARDED_FOR)_信息快讯网图(1)

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

获取用户Ip地址通用方法与常见安全隐患(HTTP_X_FORWARDED_FOR)_信息快讯网

 

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

获取用户Ip地址通用方法与常见安全隐患(HTTP_X_FORWARDED_FOR)_信息快讯网

 

哈哈,看到上面结果没,x-forwarded-for不光可以自己设置值,而且可以设置任意格式值。 这样一来,好比就直接有一个可以写入任意值的字段。并且服务器直接读取,或者写入数据库,或者做显示。它将带来危险性,跟一般对入输入没有做任何过滤检测,之间操作数据源结果一样。 并且容易带来隐蔽性。

结论:

上面getip函数,除了客户端可以任意伪造IP,并且可以传入任意格式IP。 这样结果会带来2大问题,其一,如果你设置某个页面,做IP限制。 对方可以容易修改IP不断请求该页面。 其二,这类数据你如果直接使用,将带来SQL注册,跨站攻击等漏洞。至于其一,可以在业务上面做限制,最好不采用IP限制。 对于其二,这类可以带来巨大网络风险。我们必须加以纠正。

需要对getip 进行修改,得到安全的getip函数。

这类问题,其实很容易出现,以前我就利用这个骗取了大量伪装投票。有它的隐蔽性,其实只要我们搞清楚了,某些值来龙去脉的话。理解了它的原理,修复该类bug将是非常容易。

题外话,做技术,有三步,先要会做,会解决;后要思考为什么要这么做,原因原理是什么;最后是怎么样做,有没有其它方法。多问问自己,你发现距离技术真理越来越近。你做事会越来越得心应手的!

作者:chengmo QQ:8292669

使用淘宝IP库获取用户ip地理位置
php中OR与|| AND与&&的区别总结
PHP error_log()将错误信息写入一个文件(定义和用法)
使用PHP导出Word文档的原理和实例
PHP JS Ip地址及域名格式检测代码
使用php判断服务器是否支持Gzip压缩功能
PHP加密函数 Javascript/Js 解密函数
PHP和JavaScrip分别获取关联数组的键值示例代码
php读取本地文件常用函数(fopen与file_get_contents)
深入解析php中的foreach函数
PHP取整函数:ceil,floor,round,intval的区别详细解析
完美解决PHP中的Cannot modify header information 问题
php中如何使对象可以像数组一样进行foreach循环
php number_format() 函数通过千位分组来格式化数字的实现代码
Smarty foreach控制循环次数的实现详解
web站点获取用户IP的安全方法 HTTP_X_FORWARDED_FOR检验
php源代码安装常见错误与解决办法分享
基于wordpress主题制作的具体实现步骤
setcookie中Cannot modify header information-headers already sent by错误的解决方法详解
php gzip压缩输出的实现方法
Eclipse中php插件安装及Xdebug配置的使用详解
php简单开启gzip压缩方法(zlib.output_compression)
做了CDN获取用户真实IP的函数代码(PHP与Asp设置方式)
关于shopex同步ucenter的redirect问题,导致script不运行
PHP 自定义错误处理函数trigger_error()
PHP Directory 函数的详解
APACHE的AcceptPathInfo指令使用介绍
在windows服务器开启php的gd库phpinfo中未发现
整理的一些实用WordPress后台MySQL操作命令
PHP fopen 读取带中文URL地址的一点见解
php获取ip的三个属性区别介绍(HTTP_X_FORWARDED_FOR,HTTP_VIA,REMOTE_ADDR)
PHP中使用foreach和引用导致程序BUG的问题介绍
php循环语句 for()与foreach()用法区别介绍
PHP文章采集URL补全函数(FormatUrl)
©2014-2024 dbsqp.com