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 相关文章推荐
使用 MySQL 开始 PHP 会话
Dec 21 PHP
php xfocus防注入资料
Apr 27 PHP
PHP 中关于ord($str)>0x80的详细说明
Sep 23 PHP
php创建基本身份认证站点的方法详解
Jun 08 PHP
php 中文字符串首字母的获取函数分享
Nov 04 PHP
Linux下php5.4启动脚本
Aug 03 PHP
php利用cookie实现自动登录的方法
Dec 10 PHP
在php和MySql中计算时间差的方法详解
Mar 27 PHP
php实现支持中文的文件下载功能示例
Aug 30 PHP
php curl获取https页面内容,不直接输出返回结果的设置方法
Jan 15 PHP
Laravel框架查询构造器简单示例
May 08 PHP
PHP实现新型冠状病毒疫情实时图的实例
Feb 04 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
ThinkPHP3.2.2的插件控制器功能简述
2014/07/09 PHP
thinkPHP实现基于ajax的评论回复功能
2018/06/22 PHP
JQUERY 对象与DOM对象之两者相互间的转换
2009/04/27 Javascript
JS阻止用户多次提交示例代码
2014/03/26 Javascript
js实现图片无缝滚动
2015/12/23 Javascript
深入解析Javascript闭包的功能及实现方法
2016/07/10 Javascript
JSON 对象未定义错误的解决方法
2016/09/29 Javascript
利用angular.copy取消变量的双向绑定与解析
2016/11/25 Javascript
深入理解vue.js双向绑定的实现原理
2016/12/05 Javascript
Angular在模板驱动表单中自定义校验器的方法
2017/08/09 Javascript
Webpack path与publicPath的区别详解
2018/05/03 Javascript
Node.js中的不安全跳转如何防御详解
2018/10/21 Javascript
vue踩坑记-在项目中安装依赖模块npm install报错
2019/04/02 Javascript
vue cli3.0 引入eslint 结合vscode使用
2019/05/27 Javascript
微信小程序简单的canvas裁剪图片功能详解
2019/07/12 Javascript
vue-cli 为项目设置别名的方法
2019/10/15 Javascript
Vue数字输入框组件的使用方法
2019/10/19 Javascript
Python 列表list使用介绍
2014/11/30 Python
Python实现对PPT文件进行截图操作的方法
2015/04/28 Python
Python实现Youku视频批量下载功能
2017/03/14 Python
Python统计单词出现的次数
2018/04/04 Python
Python堆排序原理与实现方法详解
2018/05/11 Python
深入理解Django自定义信号(signals)
2018/10/15 Python
Python3.0中普通方法、类方法和静态方法的比较
2019/05/03 Python
python GUI库图形界面开发之PyQt5滚动条控件QScrollBar详细使用方法与实例
2020/03/06 Python
解决python便携版无法直接运行py文件的问题
2020/09/01 Python
python与js主要区别点总结
2020/09/13 Python
微软俄罗斯官方网站:Microsoft俄罗斯
2016/09/18 全球购物
Peter Alexander新西兰站:澳大利亚领先的睡衣设计师品牌
2016/12/10 全球购物
The Beach People美国:澳洲海滨奢华品牌
2018/07/05 全球购物
瑞典度假品牌:OAS
2019/05/28 全球购物
大学生实习证明范本
2014/09/19 职场文书
大学生饮品店创业计划书范文
2019/07/10 职场文书
Promise面试题详解之控制并发
2021/05/14 面试题
详解PHP设计模式之依赖注入模式
2021/05/25 PHP
javascript条件式访问属性和箭头函数介绍
2021/11/17 Javascript