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 静态变量的初始化
Nov 15 PHP
控制PHP的输出:缓存并压缩动态页面
Jun 11 PHP
php错误级别的设置方法
Jun 17 PHP
ThinkPHP3.1.3版本新特性概述
Jun 19 PHP
php出现web系统多域名登录失败的解决方法
Sep 30 PHP
Thinkphp中数据按分类嵌套循环实现方法
Oct 30 PHP
php ajax实现文件上传进度条
Mar 29 PHP
自定义min版smarty模板引擎MinSmarty.class.php文件及用法
May 20 PHP
详解PHP安装mysql.so扩展的方法
Dec 31 PHP
Laravel中的chunk组块结果集处理与注意问题
Aug 15 PHP
PHP实现的抓取小说网站内容功能示例
Jun 27 PHP
PHP实现页面静态化深入讲解
Mar 04 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部分常见问题总结
2008/03/27 PHP
PHP strip_tags()去除HTML、XML以及PHP的标签介绍
2014/02/18 PHP
php数组中包含中文的排序方法
2014/06/03 PHP
什么情况下可以不写PHP的闭合标签“?&gt;”
2014/08/28 PHP
php的4种常用运行方式详解
2016/12/22 PHP
VBScript版代码高亮
2006/06/26 Javascript
jquery 日期分离成年月日的代码
2010/05/14 Javascript
JavaScript 页面编码与浏览器类型判断代码
2010/06/03 Javascript
Javascript获取HTML静态页面参数传递值示例
2013/08/18 Javascript
JavaScript中this关键词的使用技巧、工作原理以及注意事项
2014/05/20 Javascript
JavaScript实现将文本框的值插入指定位置的方法
2015/08/13 Javascript
jQuery+css实现炫目的动态块漂移效果
2016/01/28 Javascript
基于jQuery实现二级下拉菜单效果
2016/02/01 Javascript
jquery单击事件和双击事件冲突解决方案
2016/03/02 Javascript
快速掌握Node.js事件驱动模型
2016/03/21 Javascript
理解javascript对象继承
2016/04/17 Javascript
AngularJS 中的事件详解
2016/07/28 Javascript
Chrome浏览器的alert弹窗禁止再次弹出后恢复的方法
2016/12/30 Javascript
一看就会的vuex实现登录验证(附案例)
2020/01/09 Javascript
JS画布动态实现黑客帝国背景效果
2020/11/08 Javascript
[08:44]和酒神一起战斗 DOTA2教你做大人
2014/03/27 DOTA
使用Python &amp; Flask 实现RESTful Web API的实例
2017/09/19 Python
python使用turtle绘制国际象棋棋盘
2019/05/23 Python
python脚本后台执行方式
2019/12/21 Python
Python连接mysql数据库及简单增删改查操作示例代码
2020/08/03 Python
浅谈关于html5中图片抛物线运动的一些心得
2018/01/09 HTML / CSS
Chain Reaction Cycles俄罗斯:世界上最大的在线自行车商店
2019/08/27 全球购物
《蒲公英》教学反思
2014/02/28 职场文书
公司法人授权委托书范本
2014/09/12 职场文书
优秀党务工作者先进事迹材料
2014/12/25 职场文书
2014年底个人工作总结
2015/03/10 职场文书
公司的力量观后感
2015/06/05 职场文书
公司车队管理制度
2015/08/04 职场文书
2019年学校消防安全责任书(2篇)
2019/10/09 职场文书
OpenCV-Python模板匹配人眼的实例
2021/06/08 Python
攻略丨滑雪究竟该选哪款对讲机?
2022/02/18 无线电