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 相关文章推荐
一个ubbcode的函数,速度很快.
Oct 09 PHP
php printf输出格式使用说明
Dec 05 PHP
php中通过虚代理实现延迟加载的实现代码
Jun 10 PHP
php数组函数序列之array_flip() 将数组键名与值对调
Nov 07 PHP
解析php类的注册与自动加载
Jul 05 PHP
回帖脱衣服的图片实现代码
Feb 15 PHP
用php守护另一个php进程的例子
Feb 13 PHP
php session 写入数据库
Feb 13 PHP
php实现压缩合并js的方法【附demo源码下载】
Sep 22 PHP
php结合redis高并发下发帖、发微博的实现方法
Dec 15 PHP
ThinkPHP5.0框架使用build 自动生成模块操作示例
Apr 11 PHP
Laravel框架自定义公共函数的引入操作示例
Apr 16 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变量内存分配问题记录整理
2013/11/27 PHP
php简单操作mysql数据库的类
2015/04/16 PHP
thinkPHP5.0框架配置格式、加载解析与读取方法
2017/03/17 PHP
LazyForm jQuery plugin 定制您的CheckBox Radio和Select
2009/10/24 Javascript
jValidate 基于jQuery的表单验证插件
2009/12/12 Javascript
js导出table数据到excel即导出为EXCEL文档的方法
2013/10/10 Javascript
使用ajax+jqtransform实现动态加载select
2014/12/01 Javascript
javascript实现密码验证
2015/11/10 Javascript
javascript中this指向详解
2016/04/23 Javascript
关于JS中的方法是否加括号的问题
2016/07/27 Javascript
JavaScipt选取文档元素的方法(推荐)
2016/08/05 Javascript
javascript滚轮控制模拟滚动条
2016/10/19 Javascript
关于js函数解释(包括内嵌,对象等)
2016/11/20 Javascript
JS闭包与延迟求值用法示例
2016/12/22 Javascript
vue.js事件处理器是什么
2017/03/20 Javascript
Angular客户端请求Rest服务跨域问题的解决方法
2017/09/19 Javascript
jQuery实现的简单动态添加、删除表格功能示例
2017/09/21 jQuery
NW.js 简介与使用方法
2018/02/01 Javascript
JavaScript引用类型Date常见用法实例分析
2018/08/08 Javascript
微信小程序封装的HTTP请求示例【附升级版】
2019/05/11 Javascript
[01:32]2016国际邀请赛中国区预选赛IG战队首日赛后采访
2016/06/27 DOTA
对web.py设置favicon.ico的方法详解
2018/12/04 Python
python常见字符串处理函数与用法汇总
2019/10/30 Python
python GUI库图形界面开发之PyQt5 MDI(多文档窗口)QMidArea详细使用方法与实例
2020/03/05 Python
150行Python代码实现带界面的数独游戏
2020/04/04 Python
用CSS禁用输入法(CSS3 UI规范)实例解析
2012/12/04 HTML / CSS
"引用"与指针的区别是什么
2016/09/07 面试题
汇智创新科技发展有限公司
2015/12/06 面试题
大学生党课思想汇报
2013/12/29 职场文书
七年级数学教学反思
2014/01/22 职场文书
信息技术课后反思
2014/04/27 职场文书
弘扬焦裕禄精神践行三严三实心得体会
2014/10/13 职场文书
发展党员工作情况汇报
2014/10/28 职场文书
欢迎词范文
2015/01/27 职场文书
婚礼长辈答谢词
2015/09/29 职场文书
外出学习心得体会范文
2016/01/18 职场文书