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文本数据库的搜索方法
Oct 09 PHP
php session 检测和注销
Mar 16 PHP
PHP 递归效率分析
Nov 24 PHP
php中可能用来加密字符串的函数[base64_encode、urlencode、sha1]
Jan 16 PHP
JS中encodeURIComponent函数用php解码的代码
Mar 01 PHP
php+xml结合Ajax实现点赞功能完整实例
Jan 30 PHP
php中关于socket的系列函数总结
May 18 PHP
PHP数学运算与数据处理实例分析
Apr 01 PHP
php PDO实现的事务回滚示例
Mar 23 PHP
PHP使用第三方即时获取物流动态实例详解
Apr 27 PHP
PHP编程快速实现数组去重的方法详解
Jul 22 PHP
PHP设计模式之工厂模式实例总结
Sep 01 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中的日期及时间
2006/11/23 PHP
dedecms系统的广告设置代码 基础版本
2010/04/09 PHP
基于php-fpm的配置详解
2013/06/03 PHP
php源码分析之DZX1.5随机数函数random用法
2015/06/17 PHP
YII动态模型(动态表名)支持分析
2016/03/29 PHP
php+mysql查询实现无限下级分类树输出示例
2016/10/03 PHP
php外部执行命令函数用法小结
2016/10/11 PHP
给大家分享几个常用的PHP函数
2017/01/15 PHP
在JavaScript并非所有的一切都是对象
2013/04/11 Javascript
JS+flash实现chrome和ie浏览器下同时可以复制粘贴
2013/09/22 Javascript
js进行表单验证实例分析
2015/02/10 Javascript
微信小程序 Image API实例详解
2016/09/30 Javascript
微信小程序 生命周期和页面的生命周期详细介绍
2017/01/19 Javascript
Angular.JS实现无限级的联动菜单(使用demo)
2017/02/08 Javascript
详解JavaScript中js对象与JSON格式字符串的相互转换
2017/02/14 Javascript
js封装成插件的步骤方法
2017/09/11 Javascript
vue+vue-validator 表单验证功能的实现代码
2017/11/13 Javascript
Node.js readline模块与util模块的使用
2018/03/01 Javascript
Angular2进阶之如何避免Dom误区
2018/04/02 Javascript
使用element-ui table expand展开行实现手风琴效果
2019/03/15 Javascript
JS实现json数组排序操作实例分析
2019/10/28 Javascript
jQuery 实现扁平式小清新导航
2020/07/07 jQuery
Python函数中*args和**kwargs来传递变长参数的用法
2016/01/26 Python
使用python将图片格式转换为ico格式的示例
2018/10/22 Python
Django Rest framework之认证的实现代码
2018/12/17 Python
搞清楚 Python traceback的具体使用方法
2019/05/13 Python
Python 200行代码实现一个滑动验证码过程详解
2019/07/11 Python
Python爬虫爬取Bilibili弹幕过程解析
2019/10/10 Python
关于Python3爬虫利器Appium的安装步骤
2020/07/29 Python
python爬虫构建代理ip池抓取数据库的示例代码
2020/09/22 Python
TCP/IP中的TCP和IP分别承担什么责任
2012/04/21 面试题
公务员的自我鉴定
2013/10/26 职场文书
小学校园之星事迹材料
2014/05/16 职场文书
校庆活动策划方案
2014/06/05 职场文书
债务授权委托书范本
2014/10/17 职场文书
煤矿施工安全协议书
2016/03/22 职场文书