获取用户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 高级课程笔记 面向对象
Jun 21 PHP
PHP 清空varnish 缓存的详解(包括指定站点下的)
Jun 20 PHP
XAMPP安装与使用方法详细解析
Nov 27 PHP
PHP使用ob_start生成html页面的方法
Nov 07 PHP
PHP下载远程文件到本地存储的方法
Mar 24 PHP
PHP 读取文本文件内容并分页显示
Jan 02 PHP
PHP使用Mysqli类库实现完美分页效果的方法
Apr 07 PHP
php版微信自动登录并获取昵称的方法
Sep 23 PHP
php 运算符与表达式详细介绍
Nov 30 PHP
详解关于php的xdebug配置(编辑器vscode)
Jan 29 PHP
php桥接模式应用案例分析
Oct 23 PHP
Laravel Eloquent分表方法并使用模型关联的实现
Nov 25 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
BBS(php & mysql)完整版(四)
2006/10/09 PHP
Discuz板块横排显示图片的实现方法
2007/05/28 PHP
30 个很棒的PHP开源CMS内容管理系统小结
2011/10/14 PHP
php删除左端与右端空格的方法
2014/11/29 PHP
Zend Framework教程之Zend_Layout布局助手详解
2016/03/04 PHP
php flush无效,IIS7下php实时输出的方法
2016/08/25 PHP
php结合imgareaselect实现图片裁剪
2015/07/05 Javascript
如何使用PHP+jQuery+MySQL实现异步加载ECharts地图数据(附源码下载)
2016/02/23 Javascript
javascript先序遍历DOM树的方法
2016/02/27 Javascript
javascript简写常用的12个技巧(可以大大减少你的js代码量)
2020/03/28 Javascript
vue脚手架搭建过程图解
2018/06/06 Javascript
详解Node.js中path模块的resolve()和join()方法的区别
2018/10/29 Javascript
js序列化和反序列化的使用讲解
2019/01/19 Javascript
vue表单验证你真的会了吗?vue表单验证(form)validate
2019/04/07 Javascript
详解Vue+ElementUI从零开始搭建自己的网站(一、环境搭建)
2019/04/30 Javascript
React-redux实现小案例(todolist)的过程
2019/09/29 Javascript
jQuery实现的上拉刷新功能组件示例
2020/05/01 jQuery
vue 项目引入echarts 添加点击事件操作
2020/09/09 Javascript
在vue中通过render函数给子组件设置ref操作
2020/11/17 Vue.js
使用Python的Supervisor进行进程监控以及自动启动
2014/05/29 Python
详解Python中heapq模块的用法
2016/06/28 Python
python贪婪匹配以及多行匹配的实例讲解
2018/04/19 Python
使用pandas读取csv文件的指定列方法
2018/04/21 Python
利用python求积分的实例
2019/07/03 Python
python文件转为exe文件的方法及用法详解
2019/07/08 Python
Python3 中作为一等对象的函数解析
2019/12/11 Python
eBay比利时购物网站:eBay.be
2019/08/09 全球购物
JavaScript获取当前url根目录(路径)
2014/02/19 面试题
酒吧副总经理岗位职责
2013/12/10 职场文书
市级青年文明号申报材料
2014/05/26 职场文书
2014入党积极分子批评与自我批评思想汇报
2014/09/20 职场文书
会计求职自荐信
2015/03/26 职场文书
2015教师年度思想工作总结
2015/04/30 职场文书
呼兰河传读书笔记
2015/06/30 职场文书
再次探讨go实现无限 buffer 的 channel方法
2021/06/13 Golang
Linux安装Docker详细教程
2022/07/07 Servers