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 相关文章推荐
PHPlet在Windows下的安装
Oct 09 PHP
PHP4实际应用经验篇(7)
Oct 09 PHP
提高PHP性能的编码技巧以及性能优化详细解析
Aug 24 PHP
ThinkPHP之R方法实例详解
Jun 20 PHP
PHP跨平台获取服务器IP地址自定义函数分享
Dec 29 PHP
网站防止被刷票的一些思路与方法
Jan 08 PHP
php遍历CSV类实例
Apr 14 PHP
php递归函数三种实现方法及如何实现数字累加
Aug 07 PHP
PHP中empty和isset对于参数结构的判断及empty()和isset()的区别
Nov 15 PHP
PHP新建类问题分析及解决思路
Nov 19 PHP
php ucwords() 函数将字符串中每个单词的首字符转换为大写(实现代码)
May 12 PHP
PHP实现的迪科斯彻(Dijkstra)最短路径算法实例
Sep 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 团购折扣计算公式
2011/11/24 PHP
浅析PHP编程中10个最常见的错误
2014/08/08 PHP
javascript 检测浏览器类型和版本的代码
2009/09/15 Javascript
js过滤特殊字符输入适合输入、粘贴、拖拽多种情况
2014/03/22 Javascript
jquery对table中各数据的增加、保存、删除操作示例
2014/05/14 Javascript
基于jQuery实现响应式圆形图片轮播特效
2015/11/25 Javascript
jQuery定义插件的方法
2015/12/18 Javascript
JS中innerHTML和pasteHTML的区别实例分析
2016/06/22 Javascript
jquery 实现回车登录详解及实例代码
2016/10/23 Javascript
JQuery统计input和textarea文字输入数量(代码分享)
2016/12/29 Javascript
JavaScript拖动层Div代码
2017/03/01 Javascript
微信小程序 flex实现导航实例详解
2017/04/26 Javascript
详解基于Vue/React项目的移动端适配方案
2019/08/23 Javascript
bootstrapValidator表单校验、更改状态、新增、移除校验字段的实例代码
2020/05/19 Javascript
[02:57]2014DOTA2国际邀请赛 选手辛苦解说更辛苦
2014/07/10 DOTA
python通过apply使用元祖和列表调用函数实例
2015/05/26 Python
举例讲解如何在Python编程中进行迭代和遍历
2016/01/19 Python
Python实现定制自动化业务流量报表周报功能【XlsxWriter模块】
2019/03/11 Python
使用OpenCV实现仿射变换—缩放功能
2019/08/29 Python
python实现的读取网页并分词功能示例
2019/10/29 Python
Python爬虫实现自动登录、签到功能的代码
2020/08/20 Python
Python根据URL地址下载文件并保存至对应目录的实现
2020/11/15 Python
利用Python过滤相似文本的简单方法示例
2021/02/03 Python
详解基于 Canvas 手撸一个六边形能力图
2019/09/02 HTML / CSS
基于HTML5 Canvas的3D动态Chart图表的示例
2017/11/02 HTML / CSS
美国保健品专家:Life Extension
2018/05/04 全球购物
Ibood荷兰:互联网每日最佳在线优惠
2019/02/28 全球购物
有趣的广告词
2014/03/18 职场文书
信电学院毕业生自荐书
2014/05/24 职场文书
2014幼儿园家长工作总结
2014/11/10 职场文书
2015年七年级班主任工作总结
2015/05/21 职场文书
干货分享:推荐信写作技巧!
2019/06/21 职场文书
Python anaconda安装库命令详解
2021/10/16 Python
MySQL8.0升级的踩坑历险记
2021/11/01 MySQL
Vue的过滤器你真了解吗
2022/02/24 Vue.js
让JavaScript代码更加精简的方法技巧
2022/06/01 Javascript