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 cron中的批处理
Sep 16 PHP
php面向对象全攻略 (二) 实例化对象 使用对象成员
Sep 30 PHP
php is_file()和is_dir()用于遍历目录时用法注意事项
Mar 02 PHP
php 在文件指定行插入数据的代码
May 08 PHP
基于empty函数的判断详解
Jun 17 PHP
php可应用于面包屑导航的递归寻找家谱树实现方法
Feb 02 PHP
PHP实现XML与数据格式进行转换类实例
Jul 29 PHP
PHP+Ajax简单get验证操作示例
Mar 02 PHP
Laravel框架实现调用百度翻译API功能示例
May 30 PHP
redis+php实现微博(一)注册与登录功能详解
Sep 23 PHP
PHP设计模式(五)适配器模式Adapter实例详解【结构型】
May 02 PHP
php实现自动生成验证码的实例讲解
Nov 17 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
使用sockets:从新闻组中获取文章(一)
2006/10/09 PHP
jq的get传参数在utf-8中乱码问题的解决php版
2008/07/23 PHP
PHP 二维数组和三维数组的过滤
2016/03/16 PHP
php版微信自动登录并获取昵称的方法
2016/09/23 PHP
jQuery解决下拉框select设宽度时IE 6/7/8下option超出显示不全
2013/05/27 Javascript
自动设置iframe大小的jQuery代码
2013/09/11 Javascript
原生js事件的添加和删除的封装
2014/07/01 Javascript
跟我学习javascript的var预解析与函数声明提升
2015/11/16 Javascript
AngularJS实现星星等级评分功能
2016/09/24 Javascript
浅谈javascript控制HTML5的全屏操控,浏览器兼容的问题
2016/10/10 Javascript
利用javascript实现的三种图片放大镜效果实例(附源码)
2017/01/23 Javascript
实例解析ES6 Proxy使用场景介绍
2018/01/08 Javascript
微信小程序图片轮播组件gallery slider使用方法详解
2018/01/31 Javascript
vue 动态改变静态图片以及请求网络图片的实现方法
2018/02/07 Javascript
jQuery+Datatables实现表格批量删除功能【推荐】
2018/10/24 jQuery
深入分析element ScrollBar滚动组件源码
2019/01/22 Javascript
小程序异步问题之多个网络请求依次执行并依次收集请求结果
2019/05/05 Javascript
Centos7 安装Node.js10以上版本的方法步骤
2019/10/15 Javascript
详解vue中使用axios对同一个接口连续请求导致返回数据混乱的问题
2019/11/06 Javascript
详解Python命令行解析工具Argparse
2016/04/20 Python
python实现电脑自动关机
2018/06/20 Python
Django 视图层(view)的使用
2018/11/09 Python
Python3 执行系统命令并获取实时回显功能
2019/07/09 Python
python线程的几种创建方式详解
2019/08/29 Python
matplotlib实现显示伪彩色图像及色度条
2019/12/07 Python
Python3.7 读取音频根据文件名生成脚本的代码
2020/04/07 Python
python3 使用openpyxl将mysql数据写入xlsx的操作
2020/05/15 Python
jupyter notebook指定启动目录的方法
2021/03/02 Python
详解HTML5新增标签
2017/11/27 HTML / CSS
购买英国原创艺术:Art Gallery
2018/08/25 全球购物
Laura Geller官网:美国彩妆品牌
2018/12/29 全球购物
C#如何进行LDAP用户校验
2012/11/21 面试题
工商管理专业学生的自我评价
2013/10/01 职场文书
大学毕业生求职自荐书
2014/06/05 职场文书
大学生先进个人主要事迹材料
2015/11/04 职场文书
测量JavaScript函数的性能各种方式对比
2021/04/27 Javascript