PHP实现的限制IP投票程序IP来源分析


Posted in PHP onMay 04, 2016

本文实例分析了PHP实现的限制IP投票程序。分享给大家供大家参考,具体如下:

接到一个投票活动的需求,需要做IP限制,每个IP限制一定的投票机会。我在搜索引擎上搜索了关键词:PHP客户端IP ,结果基本上都是以下内容:

if(getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) {
   $onlineip = getenv('HTTP_CLIENT_IP');
} elseif(getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) {
   $onlineip = getenv('HTTP_X_FORWARDED_FOR');
} elseif(getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) {
   $onlineip = getenv('REMOTE_ADDR');
} elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) {
   $onlineip = $_SERVER['REMOTE_ADDR'];
}

这段代码在使用广泛的 《discuz》论坛软件,以及众多开放源代码的PHP软件里都会有使用到,大致思路是获取最终的客户端IP地址(能获得使用代理访问的用户的IP地址)。

由于很多成熟的程序都使用了这段代码获取客户端IP地址,所以我也就放心的运用在了程序里,好在后来有同事提醒,发现这段代码不能用在限制IP的投票程序里,因为 HTTP_X_FORWARDED_FOR这个是可以伪造的,只要在请求头里增加 X-Forwarded-For 。在服务器端的 $_SERVER[‘HTTP_X_FORWARDED_FOR'] 接收到的就是这个请求头的内容。

下面我用程序说明一下:

http://localhost/i.php 内容是通过上面的代码获取IP地址,并打印出来。

编写构造请求的代吗,请求这个URL:其中在请求头里增加了X-Forwarded-For这个参数:

$head = array();
$head[] = 'GET /i.php HTTP/1.1';
$head[] = 'Host: localhost';
$head[] = 'X-Forwarded-For: 255.255.255.255' ;
$head[] = 'Connection: Close' ;
$head = join("rn",$head) ;
$head .= "rnrn";
$fp = fsockopen('localhost', 80);
fwrite($fp, $head);
$response = array() ;
while($buff = fread($fp, 4096)){
   $response[] = $buff;
}
print join('',$response) ;

执行这段代码,可以得知,服务器端(localhost/i.php) 打印了 255.255.255.255 。
说明了这种获取客户端IP的方法在限制IP的投票活动里是不可取的,客户端的IP地址可用伪造。而直接使用  $_SERVER['REMOTE_ADDR'] 虽然获取到的不是用户的最终IP地址,但是限制的功能是直接有效的达到了。

当然,也不能说那段代码是错误的。在一些对IP不做限制的需求里,应该使用,比如,在一些有很多地域性子网站的网站,通过用户访问的IP,直接跳转到该用户所在区域的子网站等。

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
PHP中将数组转成XML格式的实现代码
Aug 08 PHP
php在文件指定行中写入代码的方法
May 23 PHP
PHP分页详细讲解(有实例)
Oct 30 PHP
php获取字段名示例分享
Mar 03 PHP
WordPress中编写自定义存储字段的相关PHP函数解析
Dec 25 PHP
php实现word转html的方法
Jan 22 PHP
php获取ip及网址的简单方法(必看)
Apr 01 PHP
PHP Laravel 上传图片、文件等类封装
Aug 16 PHP
PHP使用微信开发模式实现搜索已发送图文及匹配关键字回复的方法
Sep 13 PHP
PHP+AJAX 投票器功能
Nov 11 PHP
PHP实现用session来实现记录用户登陆信息
Oct 15 PHP
PHP解决高并发的优化方案实例
Dec 10 PHP
php使用Header函数,PHP_AUTH_PW和PHP_AUTH_USER做用户验证
May 04 #PHP
PHP实现获取并生成数据库字典的方法
May 04 #PHP
PHP创建/删除/复制文件夹、文件
May 03 #PHP
Yii2使用swiftmailer发送邮件的方法
May 03 #PHP
php读取torrent种子文件内容的方法(测试可用)
May 03 #PHP
Yii2 输出xml格式数据的方法
May 03 #PHP
php面向对象值单例模式
May 03 #PHP
You might like
PHP isset()与empty()的使用区别详解
2010/08/29 PHP
ThinkPHP自动验证失败的解决方法
2011/06/09 PHP
PHP支持多种格式图片上传(支持jpg、png、gif)
2011/11/03 PHP
php解析xml方法实例详解
2015/05/12 PHP
PHP整合七牛实现上传文件
2015/07/03 PHP
PHP简单实现无限级分类的方法
2016/05/13 PHP
针对多用户实现头像上传功能PHP代码 适用于登陆页面制作
2016/08/17 PHP
PHP面向对象程序设计中的self、static、parent关键字用法分析
2019/08/14 PHP
PHP 进程池与轮询调度算法实现多任务的示例代码
2019/11/26 PHP
各种效果的jquery ui(接口)介绍
2008/09/17 Javascript
javascript 常用代码技巧大收集
2009/02/25 Javascript
js简单实现用户注册信息的校验代码
2013/11/15 Javascript
浅谈轻量级js模板引擎simplite
2015/02/13 Javascript
关于JS变量和作用域详解
2016/07/28 Javascript
vue2组件实现懒加载浅析
2017/03/29 Javascript
从零开始学习Node.js系列教程之设置HTTP头的方法示例
2017/04/13 Javascript
深入理解Angular4订阅(Subscribe)与取消
2017/11/22 Javascript
谈谈vue中mixin的一点理解
2017/12/12 Javascript
three.js实现3D模型展示的示例代码
2017/12/31 Javascript
Angular 数据请求的实现方法
2018/05/07 Javascript
nodejs中用npm初始化来创建package.json的实例讲解
2018/10/10 NodeJs
通过javascript实现扫雷游戏代码实例
2020/02/09 Javascript
如何使用 JavaScript 操作浏览器历史记录 API
2020/11/24 Javascript
在Python程序中操作文件之flush()方法的使用教程
2015/05/24 Python
Python的MongoDB模块PyMongo操作方法集锦
2016/01/05 Python
python方法生成txt标签文件的实例代码
2018/05/10 Python
Python 单元测试(unittest)的使用小结
2018/11/14 Python
python向字符串中添加元素的实例方法
2019/06/28 Python
ML神器:sklearn的快速使用及入门
2019/07/11 Python
python使用装饰器作日志处理的方法
2019/07/11 Python
Python持续监听文件变化代码实例
2020/07/22 Python
全面介绍python中很常用的单元测试框架unitest
2020/12/14 Python
python 基于opencv操作摄像头
2020/12/24 Python
Django中的DateTimeField和DateField实现
2021/02/24 Python
《桂花雨》教学反思
2014/04/12 职场文书
大一新生期末自我评价
2014/09/12 职场文书