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 相关文章推荐
php中看实例学正则表达式
Dec 25 PHP
一个典型的PHP分页实例代码分享
Jul 28 PHP
解析Ubuntu下crontab命令的用法
Jun 24 PHP
PHP根据传来的16进制颜色代码自动改变背景颜色
Jun 13 PHP
Laravel 5.0 发布 新版本特性详解
Feb 10 PHP
PHP经典面试题集锦
Mar 19 PHP
创建无限极分类树型结构的简单方法
Jun 20 PHP
PHP策略模式定义与用法示例
Jul 27 PHP
PHP异常处理定义与使用方法分析
Jul 25 PHP
PHP 访问数据库配置通用方法(json)
May 20 PHP
PHP关于foreach复制知识点总结
Jan 28 PHP
Thinkphp整合阿里云OSS图片上传实例代码
Apr 28 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
用Flash图形化数据(二)
2006/10/09 PHP
PHP中如何实现常用邮箱的基本判断
2014/01/07 PHP
PHP英文字母大小写转换函数小结
2014/05/03 PHP
Thinkphp 框架扩展之驱动扩展实例分析
2020/04/27 PHP
关于Anemometer图形化显示MySQL慢日志的工具搭建及使用的详细介绍
2020/07/13 PHP
javascript TextArea动态显示剩余字符
2008/10/22 Javascript
Jquery截取中文字符串的实现代码
2010/12/22 Javascript
javascript设计模式之解释器模式详解
2014/06/05 Javascript
angularJS中router的使用指南
2015/02/09 Javascript
jquery中JSON的解析方式
2015/03/16 Javascript
详解javascript中原始数据类型Null和Undefined
2015/12/17 Javascript
self.attachevent is not a function的解决方法
2017/04/04 Javascript
完美实现js拖拽效果 return false用法详解
2017/07/28 Javascript
js图片上传的封装代码
2017/08/01 Javascript
js实现复制功能(多种方法集合)
2018/01/06 Javascript
react.js组件实现拖拽复制和可排序的示例代码
2018/08/20 Javascript
vue3.0 CLI - 2.4 - 新组件 Forms.vue 中学习表单
2018/09/14 Javascript
实例分析JS中的相等性判断===、 ==和Object.is()
2019/11/17 Javascript
vue使用require.context实现动态注册路由
2020/12/25 Vue.js
Python黑魔法@property装饰器的使用技巧解析
2016/06/16 Python
Python实现代码统计工具(终极篇)
2016/07/04 Python
Anaconda2下实现Python2.7和Python3.5的共存方法
2018/06/11 Python
Linux下python制作名片示例
2018/07/20 Python
深入理解Python中的 __new__ 和 __init__及区别介绍
2018/09/17 Python
解决python彩色螺旋线绘制引发的问题
2019/11/23 Python
python保留小数位的三种实现方法
2020/01/07 Python
基于python实现破解滑动验证码过程解析
2020/05/28 Python
python函数超时自动退出的实操方法
2020/12/28 Python
公务员综合考察材料
2014/02/01 职场文书
电子工程专业毕业生求职信
2014/03/14 职场文书
党的群众路线教育实践活动个人整改方案
2014/10/25 职场文书
音乐课外活动总结
2015/05/09 职场文书
教学质量月活动总结
2015/05/11 职场文书
2016年教师政治思想表现评语
2015/12/02 职场文书
PHP对接阿里云虚拟号的实现(号码隐私保护)
2021/04/06 PHP
MySQL 逻辑备份与恢复测试的相关总结
2021/05/14 MySQL