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后台多用户权限组思路与实现程序代码分享
Feb 13 PHP
php对数组排序代码分享
Feb 24 PHP
ThinkPHP应用模式扩展详解
Jul 16 PHP
PHP使用CURL实现对带有验证码的网站进行模拟登录的方法
Jul 23 PHP
php使用iconv中文截断问题的解决方法
Feb 11 PHP
PHP生成plist数据的方法
Jun 16 PHP
PHP实现操作redis的封装类完整实例
Nov 14 PHP
PHP设计模式之简单投诉页面实例
Feb 24 PHP
PHP递归获取目录内所有文件的实现方法
Nov 01 PHP
php文件上传 你真的掌握了吗
Nov 28 PHP
详解Yii2.0使用AR联表查询实例
Jun 16 PHP
Codeigniter里的无刷新上传的实现代码
Apr 14 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 IPV6正则表达式验证代码
2010/02/16 PHP
php用正则表达式匹配中文实例详解
2013/11/06 PHP
PHP基于php_imagick_st-Q8.dll实现JPG合成GIF图片的方法
2014/07/11 PHP
PHP实现获取域名的方法小结
2014/11/05 PHP
thinkphp备份数据库的方法分享
2015/01/04 PHP
php编写批量生成不重复的卡号密码代码
2015/05/14 PHP
php生成4位数字验证码的实现代码
2015/11/23 PHP
PHP正则删除HTML代码中宽高样式的方法
2017/06/12 PHP
php 替换文章中的图片路径,下载图片到本地服务器的方法
2018/02/06 PHP
图片完美缩放
2006/09/07 Javascript
js中eval()函数和trim()去掉字符串左右空格应用
2013/02/02 Javascript
jquery获得同源iframe内body下标签的值的方法
2014/09/25 Javascript
angularjs基础教程
2014/12/25 Javascript
基于jQuery实现最基本的淡入淡出效果实例
2015/02/02 Javascript
AngularJs学习第八篇 过滤器filter创建
2016/06/08 Javascript
JS实现获取图片大小和预览的方法完整实例【兼容IE和其它浏览器】
2017/04/24 Javascript
微信小程序页面间值传递的两种方法
2018/11/26 Javascript
js实现批量删除功能
2020/08/27 Javascript
django中的setting最佳配置小结
2017/11/21 Python
详解Django 中是否使用时区的区别
2018/06/14 Python
在vscode中配置python环境过程解析
2019/09/28 Python
python标准库sys和OS的函数使用方法与实例详解
2020/02/12 Python
python GUI库图形界面开发之PyQt5结合Qt Designer创建信号与槽的详细方法与实例
2020/03/08 Python
python 调整图片亮度的示例
2020/12/03 Python
CSS3实现类似翻书效果的过渡动画的示例代码
2019/09/06 HTML / CSS
令人啧啧称赞的经理推荐信
2013/11/07 职场文书
文员岗位职责
2013/11/09 职场文书
高一英语教学反思
2014/01/22 职场文书
优秀班组长事迹
2014/05/31 职场文书
先进集体申报材料
2014/12/25 职场文书
慰问信格式
2015/02/14 职场文书
2015年酒店年度工作总结
2015/05/23 职场文书
法人身份证明书
2015/06/18 职场文书
创业计划书之废品回收
2019/09/26 职场文书
详细分析PHP7与PHP5区别
2021/06/26 PHP
字节飞书面试promise.all实现示例
2022/06/16 Javascript