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学习 计数器实例代码
Jun 15 PHP
Discuz 6.0+ 批量注册用户名
Sep 13 PHP
使用GROUP BY的时候如何统计记录条数 COUNT(*) DISTINCT
Apr 23 PHP
PHP函数addslashes和mysql_real_escape_string的区别
Apr 22 PHP
WordPress开发中的get_post_custom()函数使用解析
Jan 04 PHP
详解php中反射的应用
Mar 15 PHP
php json中文编码为null的解决办法
Dec 14 PHP
php中简单的对称加密算法实现
Jan 05 PHP
php中Redis的应用--消息传递
Mar 28 PHP
php7函数,声明,返回值等新特性介绍
May 25 PHP
总结PHP代码规范、流程规范、git规范
Jun 18 PHP
PHP 数组操作详解【遍历、指针、函数等】
May 13 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/25 PHP
PHP 引用是个坏习惯
2010/03/12 PHP
php array的学习笔记
2012/05/10 PHP
浅析memcache启动以及telnet命令详解
2013/06/28 PHP
PDO::quote讲解
2019/01/29 PHP
JS版网站风格切换实例代码
2008/10/06 Javascript
JavaScript去掉空格的方法集合
2010/12/28 Javascript
获取offsetTop和offsetLeft值的js代码(兼容)
2013/04/16 Javascript
Js判断参数(String,Array,Object)是否为undefined或者值为空
2013/11/04 Javascript
JavaScript中统计Textarea字数并提示还能输入的字符
2014/06/10 Javascript
js事件源window.event.srcElement兼容性写法(详解)
2016/11/25 Javascript
bootstrap日历插件datetimepicker使用方法
2016/12/14 Javascript
vue-cli + sass 的正确打开方式图文详解
2017/10/27 Javascript
详解ajax的data参数错误导致页面崩溃
2018/04/30 Javascript
浅谈 Webpack 如何处理图片(开发、打包、优化)
2019/05/15 Javascript
TypeScript之调用栈的实现
2019/12/31 Javascript
Vue-router 报错NavigationDuplicated的解决方法
2020/03/31 Javascript
[41:52]2018DOTA2亚洲邀请赛3月29日 小组赛A组 TNC VS OpTic
2018/03/30 DOTA
[03:13]DOTA2-DPC中国联赛1月25日Recap集锦
2021/03/11 DOTA
Python正则表达式匹配ip地址实例
2014/10/09 Python
Django学习教程之静态文件的调用详解
2018/05/08 Python
python读取TXT每行,并存到LIST中的方法
2018/10/26 Python
解决Tensorboard 不显示计算图graph的问题
2020/02/15 Python
Python requests模块cookie实例解析
2020/04/14 Python
python异步Web框架sanic的实现
2020/04/27 Python
详解Python IO口多路复用
2020/06/17 Python
IE8下CSS3选择器nth-child() 不兼容问题的解决方法
2016/11/16 HTML / CSS
Conforama瑞士:家具、厨房、电器、装饰
2020/09/06 全球购物
体育教育毕业生自荐信
2013/11/21 职场文书
2014年师德师风学习材料
2014/05/16 职场文书
关于教师节的广播稿
2014/09/10 职场文书
2016年寒假社会实践活动总结
2015/10/10 职场文书
MySQL获取所有分类的前N条记录
2021/05/07 MySQL
教你如何使用Python Tkinter库制作记事本
2021/06/10 Python
Ajax实现三级联动效果
2021/10/05 Javascript
用Python生成会跳舞的美女
2022/01/18 Python