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 相关文章推荐
Zend引擎的发展 [15]
Oct 09 PHP
Gregarius中文日期格式问题解决办法
Apr 22 PHP
php实现的仿阿里巴巴实现同类产品翻页
Dec 11 PHP
记录mysql性能查询过程的使用方法
May 02 PHP
基于header的一些常用指令详解
Jun 06 PHP
学习php中的正则表达式
Aug 17 PHP
PHP文件读取功能的应用实例
May 08 PHP
PHP使用mkdir创建多级目录的方法
Dec 22 PHP
如何写php守护进程(Daemon)
Dec 30 PHP
WordPress用户登录框密码的隐藏与部分显示技巧
Dec 31 PHP
PHP保存session到memcache服务器的方法
Jan 19 PHP
PHP PDOStatement::closeCursor讲解
Jan 30 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 cookis创建实现代码
2009/03/16 PHP
php安全配置 如何配置使其更安全
2011/12/16 PHP
PHP实现HTTP断点续传的方法
2015/06/17 PHP
利用PHP获取汉字首字母并且分组排序详解
2017/10/22 PHP
JavaScript ECMA-262-3 深入解析.第三章.this
2011/09/28 Javascript
JavaScript获取当前页面上的指定对象示例代码
2014/02/28 Javascript
div失去焦点事件实现思路
2014/04/22 Javascript
jQuery实现响应鼠标滚动的动感菜单效果
2015/09/21 Javascript
jquery获取复选框checkbox的值的简单实现方法
2016/05/26 Javascript
通过bootstrap全面学习less
2016/11/09 Javascript
Vue 2.0 服务端渲染入门介绍
2017/03/29 Javascript
Angularjs 双向绑定时字符串的转换成数字类型的问题
2017/06/12 Javascript
详解nodejs的express如何自动生成项目框架
2017/07/12 NodeJs
Javascript刷新页面的实例
2017/09/23 Javascript
利用JS hash制作单页Web应用的方法详解
2017/10/10 Javascript
基于zTree树形菜单的使用实例
2017/12/25 Javascript
iview table高度动态设置方法
2018/03/14 Javascript
基于vue2.0动态组件及render详解
2018/03/17 Javascript
为什么要使用Vuex的介绍
2019/01/19 Javascript
原生JS实现记忆翻牌游戏
2020/07/31 Javascript
python和shell实现的校验IP地址合法性脚本分享
2014/10/23 Python
python导入时小括号大作用
2017/01/10 Python
Django中多种重定向方法使用详解
2019/07/17 Python
numpy.linalg.eig() 计算矩阵特征向量方式
2019/11/29 Python
Pytorch maxpool的ceil_mode用法
2020/02/18 Python
Python基于进程池实现多进程过程解析
2020/04/30 Python
Python docutils文档编译过程方法解析
2020/06/23 Python
Anaconda+spyder+pycharm的pytorch配置详解(GPU)
2020/10/18 Python
加拿大专业美发产品购物网站:Chatters
2021/02/28 全球购物
留学自荐信
2013/10/10 职场文书
优秀团干部个人事迹
2014/05/29 职场文书
上课迟到检讨书
2015/05/06 职场文书
工作简报范文
2015/07/21 职场文书
幽默导游词应该怎么写?
2019/08/26 职场文书
Java 多线程并发FutureTask
2022/06/28 Java/Android