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 08 PHP
php json_encode值中大括号与花括号区别
Sep 30 PHP
PHP中feof()函数实例测试
Aug 23 PHP
PHP基本语法总结
Sep 06 PHP
php中使用url传递数组的方法
Feb 11 PHP
PHP判断网络文件是否存在的方法
Mar 12 PHP
thinkPHP中多维数组的遍历方法
Jan 09 PHP
PHP封装的数据库保存session功能类
Jul 11 PHP
PHP使用观察者模式处理异常信息的方法详解
Sep 24 PHP
laravel Validator ajax返回错误信息的方法
Sep 29 PHP
在Laravel中使用MongoDB的方法示例
Nov 11 PHP
laravel框架创建授权策略实例分析
Nov 22 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项目打包方法
2008/02/18 PHP
MySql中正则表达式的使用方法描述
2008/07/30 PHP
php获取通过http协议post提交过来xml数据及解析xml
2012/12/16 PHP
完美解决PHP中的Cannot modify header information 问题
2013/08/12 PHP
PHP实现的json类实例
2015/07/28 PHP
PHP远程调试之XDEBUG
2015/12/29 PHP
php利用云片网实现短信验证码功能的示例代码
2017/11/18 PHP
基于jquery的loading效果实现代码
2010/11/05 Javascript
JS弹出层的显示与隐藏示例代码
2013/12/27 Javascript
js实现文本框中焦点在最后位置
2014/03/04 Javascript
Javascript基础教程之for循环
2015/01/18 Javascript
js实现鼠标触发图片抖动效果的方法
2015/02/27 Javascript
JQuery实现动态添加删除评论的方法
2015/05/18 Javascript
利用jQuery及AJAX技术定时更新GridView的某一列数据
2015/12/04 Javascript
jQuery实现摸拟alert提示框
2016/05/22 Javascript
jquery层级选择器(匹配父元素下的子元素实现代码)
2016/09/05 Javascript
vuejs在解析时出现闪烁的原因及防止闪烁的方法
2016/09/19 Javascript
node.js 中间件express-session使用详解
2017/05/20 Javascript
[01:48]帕吉至宝加入游戏,遗迹战场现“千劫神屠”
2018/04/07 DOTA
Python对文件和目录进行操作的方法(file对象/os/os.path/shutil 模块)
2017/05/08 Python
python实现员工管理系统
2018/01/11 Python
在python win系统下 打开TXT文件的实例
2018/04/29 Python
PyCharm汉化安装及永久激活详细教程(靠谱)
2020/01/16 Python
PyQt5+python3+pycharm开发环境配置教程
2020/03/24 Python
jupyter 导入csv文件方式
2020/04/21 Python
Python 为什么推荐蛇形命名法原因浅析
2020/06/18 Python
对python pandas中 inplace 参数的理解
2020/06/27 Python
美国折扣网站:jClub
2017/08/07 全球购物
活动邀请函范文
2014/01/19 职场文书
最美护士演讲稿
2014/08/27 职场文书
大一工商管理职业生涯规划:有梦最美,行动相随
2014/09/18 职场文书
2014年禁毒工作总结
2014/11/24 职场文书
小学优秀教师材料
2014/12/15 职场文书
工作会议简报
2015/07/20 职场文书
2016党校学习心得体会
2016/01/07 职场文书
Python使用Web框架Flask开发项目
2022/06/01 Python