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 相关文章推荐
使用apache模块rewrite_module (转)
Feb 14 PHP
php 页面执行时间计算代码
Dec 04 PHP
Windows Apache2.2.11及Php5.2.9-1的安装与配置方法
Jun 08 PHP
php 遍历数据表数据并列表横向排列的代码
Sep 05 PHP
php 引用(&amp;)详解
Nov 20 PHP
php过滤所有恶意字符(批量过滤post,get敏感数据)
Mar 18 PHP
文件上传之SWFUpload插件(代码)
Jul 30 PHP
PHP页面转UTF-8中文编码乱码的解决办法
Oct 20 PHP
PHP支付系统设计与典型案例分享
Aug 02 PHP
PHP preg_match实现正则表达式匹配功能【输出是否匹配及匹配值】
Jul 19 PHP
简单实现php上传文件功能
Sep 21 PHP
PHP开发中解决并发问题的几种实现方法分析
Nov 13 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/12/06 PHP
几道坑人的PHP面试题 试试看看你会不会也中招
2014/08/19 PHP
PHP使用函数用法详解
2018/09/30 PHP
javascript 循环读取JSON数据的代码
2010/07/17 Javascript
一个网马的tips实现分析
2010/11/28 Javascript
javascript对数组的常用操作代码 数组方法总汇
2011/01/27 Javascript
jquery ajax属性async(同步异步)示例
2013/11/05 Javascript
escape函数解决js中ajax传递中文出现乱码问题
2014/10/30 Javascript
jQuery判断元素上是否绑定了指定事件的方法
2015/03/17 Javascript
jquery实现表格隔行换色效果
2015/11/19 Javascript
轻松学习jQuery插件EasyUI EasyUI创建树形菜单
2015/11/30 Javascript
利用JavaScript阻止表单提交的两种方法
2016/08/11 Javascript
bootstrap multiselect 多选功能实现方法
2017/06/05 Javascript
Node.js使用Koa搭建 基础项目
2018/01/08 Javascript
解决select2在bootstrap modal中不能正常使用的问题
2018/08/09 Javascript
keep-Alive搭配vue-router实现缓存页面效果的示例代码
2020/06/24 Javascript
python利用hook技术破解https的实例代码
2013/03/25 Python
Python中实现常量(Const)功能
2015/01/28 Python
Python素数检测实例分析
2015/06/15 Python
Windows中安装使用Virtualenv来创建独立Python环境
2016/05/31 Python
Python遍历目录中的所有文件的方法
2016/07/08 Python
Fabric 应用案例
2016/08/28 Python
JSON Web Tokens的实现原理
2017/04/02 Python
python实现微信远程控制电脑
2018/02/22 Python
用python代码将tiff图片存储到jpg的方法
2018/12/04 Python
使用python 对验证码图片进行降噪处理
2019/12/18 Python
css3学习之2D转换功能详解
2016/12/23 HTML / CSS
Kiwi.com中国:找到特价机票并发现新目的地
2019/10/27 全球购物
毕业生就业推荐信范文
2013/12/01 职场文书
《小熊住山洞》教学反思
2014/02/21 职场文书
民政局标准版离婚协议书
2014/12/01 职场文书
就业意向协议书
2015/01/29 职场文书
2015年学校教育教学工作总结
2015/04/22 职场文书
刑事起诉书范文
2015/05/19 职场文书
工资证明格式模板
2015/06/12 职场文书
MySQL配置主从服务器(一主多从)
2021/08/07 MySQL