web站点获取用户IP的安全方法 HTTP_X_FORWARDED_FOR检验


Posted in PHP onJune 01, 2013

安全过滤后的getIP函数

  function getIP() {
 $realip = ''; //设置默认值
 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'];
 }
 preg_match('/^((?:\d{1,3}\.){3}\d{1,3})/',$realip,$match);
 return $match?$match[0]:false;
}

以上函数,增加了IP判断,只会读取以Ip格式数据开头,并且第一个满足IP格式值。如果没有返回false。 这样就可以读取到满足格式的IP,验证了数据的IP格式。

如果我读取互联网的IP,用户传入局域网的IP,我应该直接过滤掉

我们在一些网站上面,经常可以看到提示,非法的IP地址,其实一部分是IP地址格式错误,一部分可能是读取到IP地址,不满足互联网上面允许IP格式。 以下这个函数,是通过IANA站点规范,封装了个函数。 通过输入IP地址,能够准确知道,该IP是不是可以在互联网应用。

//互联网允许使用IP地址
function ipType2($ip) {
 $iplist = explode(".", $ip);
 if ($iplist[0] >= 224 && $iplist[0] <= 239)
  return '多播';
 if ($iplist[0] >= 240 && $iplist[0] <= 255)
  return '保留';
 if (preg_match('/^198\.51\.100/', $ip))
  return 'TEST-NET-2,文档和示例';
 if (preg_match('/^203\.0\.113/', $ip))
  return 'TEST-NET-3,文档和示例';
 if (preg_match('/^192\.(18|19)\./', $ip))
  return '网络基准测试';
 if (preg_match('/^192\.168/', $ip))
  return '专用网络[内部网]';
 if (preg_match('/^192\.88\.99/', $ip))
  return 'ipv6to4中继';
 if (preg_match('/^192\.0\.2\./', $ip))
  return 'TEST-NET-1,文档和示例';
 if (preg_match('/^192\.0\.0\./', $ip))
  return '保留(IANA)';
 if (preg_match('/^192\.0\.0\./', $ip))
  return '保留(IANA)';
 if ($iplist[0] == 172 && $iplist[1] <= 31 && $iplist[1] >= 16)
  return '专用网络[内部网]';
 if ($iplist[0] == 169 && $iplist[1] == 254)
  return '链路本地';
 if ($iplist[0] == 127)
  return '环回地址';
 if ($iplist[0] == 10)
  return '专用网络[内部网]';
 if ($iplist[0] == 0)
  return '本网络(仅作为源地址时合法)';
 return 'InterNet网地址';
}

当你输入IP地址,它返回是“'InterNet网地址' ,那么这个IP地址不光格式正确,而且是互联网上面合法的IP地址。 这个函数很复杂,其实就是排除很多非互联网使用IP地址。 我们常见的192,127,10开头地址估计都很熟悉了。 但实际上,很多IP地址是保留的,或者留作它用。 不能作为互联网 IP使用。 有了以上两个函数,我们不光可以读到正确格式IP地址,还能够保证读到是互联网上面IP地址。 以上是工作中常使用的函数,欢迎朋友们交流!

作者:chengmo  QQ:8292669

PHP 相关文章推荐
PHP4中实现动态代理
Oct 09 PHP
PHP文章采集URL补全函数(FormatUrl)
Aug 02 PHP
php利用新浪接口查询ip获取地理位置示例
Jan 20 PHP
php使用pdo连接并查询sql数据库的方法
Dec 24 PHP
PHP预定义变量9大超全局数组用法详解
Apr 23 PHP
smarty自定义函数用法示例
May 20 PHP
Yii配置与使用memcached缓存的方法
Jul 13 PHP
php cookie工作原理与实例详解
Jul 18 PHP
php基于session锁防止阻塞请求的方法分析
Aug 07 PHP
多个Laravel项目如何共用migrations详解
Sep 25 PHP
Laravel Eloquent分表方法并使用模型关联的实现
Nov 25 PHP
基于PHP实现短信验证码发送次数限制
Jul 11 PHP
获取用户Ip地址通用方法与常见安全隐患(HTTP_X_FORWARDED_FOR)
Jun 01 #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
You might like
一个阿拉伯数字转中文数字的函数
2006/10/09 PHP
PHP的可变变量名的使用方法分享
2012/02/05 PHP
php自定义加密与解密程序实例
2014/12/31 PHP
Laravel如何使用Redis共享Session
2018/02/23 PHP
Laravel5.3+框架定义API路径取消CSRF保护方法详解
2020/04/06 PHP
jQuery 动画弹出窗体支持多种展现方式
2010/04/29 Javascript
js鼠标滑过弹出层的定位IE6bug解决办法
2012/12/26 Javascript
jquery数组之存放checkbox全选值示例代码
2013/12/20 Javascript
jQuery获得子元素个数的方法
2015/04/14 Javascript
谈谈Jquery中的children find 的区别有哪些
2015/10/19 Javascript
JS获取时间的相关函数及时间戳与时间日期之间的转换
2016/02/04 Javascript
jQuery事件绑定on()与弹窗实现代码
2016/04/28 Javascript
SWFUpload多文件上传及文件个数限制的方法
2016/05/31 Javascript
JavaScript 栈的详解及实例代码
2017/01/22 Javascript
bootstrapValidator.min.js表单验证插件
2017/02/09 Javascript
基于node.js依赖express解析post请求四种数据格式
2017/02/13 Javascript
VueJS如何引入css或者less文件的一些坑
2017/04/25 Javascript
微信小程序日历弹窗选择器代码实例
2019/05/09 Javascript
python调用Moxa PCOMM Lite通过串口Ymodem协议实现发送文件
2014/08/15 Python
Django实现简单分页功能的方法详解
2017/12/05 Python
python实现内存监控系统
2021/03/07 Python
pandas 转换成行列表进行读取与Nan处理的方法
2018/10/30 Python
python多线程+代理池爬取天天基金网、股票数据过程解析
2019/08/13 Python
Python实现微信机器人的方法
2019/09/06 Python
Python模块的制作方法实例分析
2019/12/21 Python
Python基础之变量基本用法与进阶详解
2020/01/03 Python
Python应用实现双指数函数及拟合代码实例
2020/06/19 Python
python爬取微博评论的实例讲解
2021/01/15 Python
Html5饼图绘制实现统计图的方法
2020/08/05 HTML / CSS
学生喝酒检讨书
2014/02/06 职场文书
活动总结怎么写
2014/04/28 职场文书
责任书范本
2014/08/25 职场文书
法人代表授权委托书范文
2014/09/10 职场文书
机关干部三严三实心得体会
2014/10/13 职场文书
《正比例》教学反思
2016/02/23 职场文书
redis配置文件中常用配置详解
2021/04/14 Redis