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 相关文章推荐
在Windows版的PHP中使用ADO
Oct 09 PHP
PHP 输出简单动态WAP页面
Jun 09 PHP
php 过滤危险html代码
Jun 29 PHP
PHP实现域名whois查询的代码(数据源万网、新网)
Feb 22 PHP
php radio 单选框获取与保持值的实现代码
May 15 PHP
php访问数组最后一个元素的函数end()用法
Mar 18 PHP
PHP加密解密类实例分析
Apr 20 PHP
如何使用Gitblog和Markdown建自己的博客
Jul 31 PHP
浅谈php7的重大新特性
Oct 23 PHP
Yii输入正确验证码却验证失败的解决方法
Jun 06 PHP
PHP实现时间比较和时间差计算的方法示例
Jul 24 PHP
PHP array_reduce()函数的应用解析
Oct 28 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
APACHE的AcceptPathInfo指令使用介绍
2013/01/18 PHP
Yii2创建多界面主题(Theme)的方法
2016/10/08 PHP
EasyUI中的tree用法介绍
2011/11/01 Javascript
JS+CSS实现一个气泡提示框
2013/08/18 Javascript
Node.js和PHP根据ip获取地理位置的方法
2014/03/14 Javascript
Dojo Javascript 编程规范 规范自己的JavaScript书写
2014/10/26 Javascript
javascript表格的渲染组件
2015/07/03 Javascript
BootStrap Table 分页后重新搜索问题的解决办法
2016/08/08 Javascript
JavaScript错误处理和堆栈追踪详解
2017/04/18 Javascript
jQuery初级教程之网站品牌列表效果
2017/08/02 jQuery
浅谈Vue2.0中v-for迭代语法的变化(key、index)
2018/03/06 Javascript
浅谈如何使用webpack构建多页面应用
2018/05/30 Javascript
layui表单验证select下拉框实现验证的方法
2019/09/05 Javascript
[01:00]DOTA2 store: Collection of Artisan's Wonders
2015/08/12 DOTA
初学python数组的处理代码
2011/01/04 Python
浅析Python中MySQLdb的事务处理功能
2016/09/21 Python
Python基于pygame模块播放MP3的方法示例
2017/09/30 Python
python特性语法之遍历、公共方法、引用
2018/08/08 Python
python实现zabbix发送短信脚本
2018/09/17 Python
Windows下Anaconda2安装NLTK教程
2018/09/19 Python
python+opencv像素的加减和加权操作的实现
2019/07/14 Python
对django的User模型和四种扩展/重写方法小结
2019/08/17 Python
python Tensor和Array对比分析
2020/01/08 Python
浅谈python print(xx, flush = True) 全网最清晰的解释
2020/02/21 Python
基于Python生成个性二维码过程详解
2020/03/05 Python
利用Python实现Json序列化库的方法步骤
2020/09/09 Python
html5 canvas绘制放射性渐变色效果
2018/01/04 HTML / CSS
AmazeUI 评论列表的实现示例
2020/08/13 HTML / CSS
美国时尚女装在线:Missguided
2016/12/03 全球购物
营业员实习自我鉴定
2013/12/07 职场文书
学生违反校规检讨书
2014/10/28 职场文书
2015年团支书工作总结
2015/04/03 职场文书
公务员爱岗敬业心得体会
2016/01/25 职场文书
运动会主持人开幕词
2016/03/04 职场文书
微信小程序scroll-view不能左右滑动问题的解决方法
2021/07/09 Javascript
python垃圾回收机制原理分析
2022/04/13 Python