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


Posted in PHP onJune 01, 2013

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

PHP 相关文章推荐
php和数据库结合的一个简单的web实例 代码分析 (php初学者)
Jul 28 PHP
linux命令之调试工具strace的深入分析
Jun 03 PHP
解析thinkphp的左右值无限分类
Jun 20 PHP
PHP获取数组长度或某个值出现次数的方法
Feb 11 PHP
使用 PHPStorm 开发 Laravel
Mar 24 PHP
Apache启动报错No space left on device: AH00023该怎么解决
Oct 16 PHP
[原创]PHP字符串中插入子字符串方法总结
May 06 PHP
thinkphp jquery实现图片上传和预览效果
Jul 22 PHP
php实现微信支付之退款功能
May 30 PHP
PHP从零开始打造自己的MVC框架之类的自动加载实现方法详解
Jun 03 PHP
php判断/计算闰年的方法小结【三种方法】
Jul 06 PHP
Thinkphp框架+Layui实现图片/文件上传功能分析
Feb 07 PHP
php源代码安装常见错误与解决办法分享
May 28 #PHP
如何批量替换相对地址为绝对地址(利用bat批处理实现)
May 27 #PHP
php 深入理解strtotime函数的使用详解
May 23 #PHP
如何使用PHP计算上一个月的今天
May 23 #PHP
解析php二分法查找数组是否包含某一元素
May 23 #PHP
PHP下打开phpMyAdmin出现403错误的问题解决方法
May 23 #PHP
php设计模式之观察者模式的应用详解
May 21 #PHP
You might like
PHP utf-8编码问题,utf8编码,数据库乱码,页面显示输出乱码
2013/04/08 PHP
解析PHP自带的进位制之间的转换函数
2013/06/08 PHP
根据中文裁减字符串函数的php代码
2013/12/03 PHP
php的mail函数发送UTF-8编码中文邮件时标题乱码的解决办法
2015/10/20 PHP
php微信开发之图片回复功能
2018/06/14 PHP
php提取微信账单的有效信息
2018/10/01 PHP
[转]JS宝典学习笔记
2007/02/07 Javascript
javascript网页关闭时提醒效果脚本
2008/10/22 Javascript
JQuery 常用操作代码
2010/03/14 Javascript
Jquery常用技巧收集整理篇
2010/11/14 Javascript
jquery ready(fn)事件使用介绍
2013/08/21 Javascript
Jquery 返回json数据在IE浏览器中提示下载的问题
2014/05/18 Javascript
jquery显示隐藏input对象
2014/07/21 Javascript
javascript中call,apply,bind的用法对比分析
2015/02/12 Javascript
JS实现超炫网页烟花动画效果的方法
2015/03/02 Javascript
BootStrap Select清除选中的状态恢复默认状态
2017/06/20 Javascript
Vue中引入样式文件的方法
2017/08/18 Javascript
vue-cli项目中使用Mockjs详解
2018/05/14 Javascript
jquery实现淡入淡出轮播图效果
2020/12/13 jQuery
[04:15]DOTA2-DPC中国联赛1月19日Recap集锦
2021/03/11 DOTA
Python 调用VC++的动态链接库(DLL)
2008/09/06 Python
Python及Django框架生成二维码的方法分析
2018/01/31 Python
基于python二叉树的构造和打印例子
2019/08/09 Python
Python对列表的操作知识点详解
2019/08/20 Python
css3强大的动画效果animate使用说明及浏览器兼容介绍
2013/01/09 HTML / CSS
惠普墨西哥官方商店:HP墨西哥
2016/12/01 全球购物
Internet主要有哪些网络群组成
2015/12/24 面试题
Python如何定义一个函数
2015/09/01 面试题
小学生获奖感言范文
2014/02/02 职场文书
2014年大学庆元旦迎新年活动方案
2014/03/09 职场文书
2014年为民办实事工作总结
2014/12/20 职场文书
英文感谢信范文
2015/01/21 职场文书
营运督导岗位职责
2015/04/10 职场文书
卫生院艾滋病宣传活动总结
2015/05/09 职场文书
Go缓冲channel和非缓冲channel的区别说明
2021/04/25 Golang
MySQL 使用自定义变量进行查询优化
2021/05/14 MySQL