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 相关文章推荐
我常用的几个类
Oct 09 PHP
使用 eAccelerator加速PHP代码的目的
Mar 16 PHP
php读取xml实例代码
Jan 28 PHP
php程序效率优化的一些策略小结
Jul 17 PHP
精美漂亮的php分页类代码
Apr 02 PHP
php中\r \r\n \t的区别示例介绍
Feb 08 PHP
Yii把CGridView文本框换成下拉框的方法
Dec 03 PHP
PHP查询快递信息的方法
Mar 07 PHP
PHP使用GETDATE获取当前日期时间作为一个关联数组的方法
Mar 19 PHP
php获得客户端浏览器名称及版本的方法(基于ECShop函数)
Dec 23 PHP
php表单文件iframe异步上传实例讲解
Jul 26 PHP
使用laravel和ajax实现整个页面无刷新的操作方法
Oct 03 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
Windows中安装Apache2和PHP4权威指南
2006/11/18 PHP
PHP中的MYSQL常用函数(php下操作数据库必备)
2010/09/12 PHP
php批量转换文件夹下所有文件编码的函数类
2017/08/06 PHP
thinkPHP和onethink微信支付插件分享
2019/08/11 PHP
javascript 网页跳转的方法
2008/12/24 Javascript
基于jquery的拖动布局插件
2011/11/25 Javascript
JQuery学习笔录 简单的JQuery
2012/04/09 Javascript
如何用js控制frame的隐藏或显示的解决办法
2013/03/20 Javascript
eclipse导入jquery包后报错的解决方法
2014/02/17 Javascript
浅谈jQuery中 wrap() wrapAll() 与 wrapInner()的差异
2014/11/12 Javascript
JavaScript中的继承之类继承
2016/05/01 Javascript
Vue系列:通过vue-router如何传递参数示例
2017/01/16 Javascript
highcharts 在angular中的使用示例代码
2017/09/20 Javascript
Express本地测试HTTPS的示例代码
2018/06/06 Javascript
element-ui表格列金额显示两位小数的方法
2018/08/24 Javascript
Vue源码中要const _toStr = Object.prototype.toString的原因分析
2018/12/09 Javascript
vue遍历对象中的数组取值示例
2019/11/07 Javascript
解决Ant Design Modal内嵌Form表单initialValue值不动态更新问题
2020/10/29 Javascript
Python函数可变参数定义及其参数传递方式实例详解
2015/05/25 Python
python Django框架实现自定义表单提交
2016/03/25 Python
python实现人人自动回复、抢沙发功能
2018/06/08 Python
Django使用paginator插件实现翻页功能的实例
2018/10/24 Python
Python简单基础小程序的实例代码
2019/04/28 Python
详解Numpy数组转置的三种方法T、transpose、swapaxes
2019/05/27 Python
python程序运行进程、使用时间、剩余时间显示功能的实现代码
2019/07/11 Python
Python模拟登录之滑块验证码的破解(实例代码)
2019/11/18 Python
python实现百度OCR图片识别过程解析
2020/01/17 Python
Tensorflow:转置函数 transpose的使用详解
2020/02/11 Python
Python单例模式的四种创建方式实例解析
2020/03/04 Python
关于python中的xpath解析定位
2020/03/06 Python
CSS3 Notes: -webkit-box-reflect实现倒影的实例
2016/12/08 HTML / CSS
纯CSS3制作的鼠标悬停时边框旋转
2017/01/03 HTML / CSS
伊琍体标语
2014/06/25 职场文书
公务员上班玩游戏检讨书
2014/09/17 职场文书
社区工作者个人总结
2015/02/28 职场文书
排查并解决MySQL生产库内存使用率高的报警
2022/04/11 MySQL