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 strtok()函数的优点分析
Mar 02 PHP
php将数据库中所有内容生成静态html文档的代码
Apr 12 PHP
采集邮箱的php代码(抓取网页中的邮箱地址)
Jul 17 PHP
php检测网页是否被百度收录的函数代码
Oct 09 PHP
php过滤XSS攻击的函数
Nov 12 PHP
PHP 抽象方法与抽象类abstract关键字介绍及应用
Oct 16 PHP
php选择排序法实现数组排序实例分析
Feb 16 PHP
PHP操作mysql数据库分表的方法
Jun 09 PHP
Android AsyncTack 异步任务实例详解
Nov 02 PHP
WAF的正确bypass
Jan 05 PHP
PHP字符串逆序排列实现方法小结【strrev函数,二分法,循环法,递归法】
Jan 13 PHP
php大小写转换函数(strtolower、strtoupper)用法介绍
Nov 17 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
php通过文件头检测文件类型通用代码类(zip,rar等)
2010/10/19 PHP
php获取用户真实IP和防刷机制的实例代码
2018/11/28 PHP
类似框架的js代码
2006/11/09 Javascript
extJs 下拉框联动实现代码
2010/04/09 Javascript
《JavaScript DOM 编程艺术》读书笔记之DOM基础
2015/01/09 Javascript
JavaScript数组随机排列实现随机洗牌功能
2015/03/19 Javascript
基于javascript html5实现3D翻书特效
2016/03/14 Javascript
js数组去重的hash方法
2016/12/22 Javascript
bootstrap css样式之表单
2017/01/19 Javascript
解决Node.js使用MySQL出现connect ECONNREFUSED 127.0.0.1:3306的问题
2017/03/09 Javascript
div中文字内容溢出常见的解决方法
2017/03/16 Javascript
vue v-model动态生成详解
2018/06/30 Javascript
解决vue项目使用font-awesome,build后路径的问题
2018/09/01 Javascript
详解Vue中的scoped及穿透方法
2019/04/18 Javascript
layui表格内容溢出的解决方法
2019/09/06 Javascript
Vue最新防抖方案(必看篇)
2019/10/30 Javascript
基于JavaScript实现控制下拉列表
2020/05/08 Javascript
[01:54]TI4西雅图DOTA2选手欢迎晚宴 现场报道
2014/07/08 DOTA
Python实现读取及写入csv文件的方法示例
2018/01/12 Python
python 读取txt中每行数据,并且保存到excel中的实例
2018/04/29 Python
python获取本机所有IP地址的方法
2018/12/26 Python
CSS3 文字动画效果
2020/11/12 HTML / CSS
英国男士时尚购物网站:Stuarts London
2017/10/22 全球购物
一些高难度的SQL面试题
2016/11/29 面试题
internal修饰符起什么作用
2013/12/16 面试题
学校万圣节活动方案
2014/02/13 职场文书
《蜗牛》教学反思
2014/02/18 职场文书
公司建议书怎么写
2014/05/15 职场文书
银行主办会计岗位职责
2014/08/13 职场文书
《改造我们的学习》心得体会
2014/11/07 职场文书
廉政承诺书
2015/01/19 职场文书
村官个人总结范文
2015/03/03 职场文书
住房公积金贷款工资证明
2015/06/12 职场文书
​(迎国庆)作文之我爱我的祖国
2019/09/19 职场文书
Django如何与Ajax交互
2021/04/29 Python
python多线程方法详解
2022/01/18 Python