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 09 PHP
介绍几个array库的新函数 php
Dec 29 PHP
PHP 读取和修改大文件的某行内容的代码
Oct 30 PHP
献给php初学者(入门学习经验谈)
Oct 12 PHP
PHP错误提示的关闭方法详解
Jun 23 PHP
使用array_map简单搞定PHP删除文件、删除目录
Oct 29 PHP
使用GD库生成带阴影文字的图片
Mar 27 PHP
PHP将Excel导入数据库及数据库数据导出至Excel的方法
Jun 24 PHP
PHP图像识别技术原理与实现
Oct 27 PHP
解决微信授权回调页面域名只能设置一个的问题
Dec 11 PHP
PHP addslashes()函数讲解
Feb 03 PHP
实例讲解PHP表单
Jun 10 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写的简易聊天室代码
2011/06/04 PHP
PHP中的session安全吗?
2016/01/22 PHP
CI框架源码解读之利用Hook.php文件完成功能扩展的方法
2016/05/18 PHP
JavaScript DOM学习第一章 W3C DOM简介
2010/02/19 Javascript
Jquery Validation插件防止重复提交表单的解决方法
2010/03/05 Javascript
javascript中用星号表示预录入内容的实现代码
2011/01/08 Javascript
简短几句jquery代码的实现一个图片向上滚动切换
2011/09/02 Javascript
jQuery之ajax技术的详细介绍
2013/06/19 Javascript
js动态设置div的值下例子
2013/10/29 Javascript
JavaScript代码生成PDF文件的方法
2016/02/26 Javascript
极简主义法编写JavaScript类
2017/11/02 Javascript
Vue代码分割懒加载的实现方法
2017/11/23 Javascript
JS设计模式之观察者模式实现实时改变页面中金额数的方法
2018/02/05 Javascript
vue服务端渲染添加缓存的方法
2018/09/18 Javascript
vue打包相关细节整理(小结)
2018/09/28 Javascript
Vue中的作用域CSS和CSS模块的区别
2018/10/09 Javascript
微信JS-SDK实现微信会员卡功能(给用户微信卡包里发送会员卡)
2019/07/25 Javascript
layUI实现列表查询功能
2019/07/27 Javascript
使用next.js开发网址缩短服务的方法
2020/06/17 Javascript
vuex中store存储store.commit和store.dispatch的用法
2020/07/24 Javascript
Python转换HTML到Text纯文本的方法
2015/01/15 Python
简单谈谈python的反射机制
2016/06/28 Python
Python网络爬虫出现乱码问题的解决方法
2017/01/05 Python
Python使用Matplotlib实现Logos设计代码
2017/12/25 Python
Python3数据库操作包pymysql的操作方法
2018/07/16 Python
在python下读取并展示raw格式的图片实例
2019/01/24 Python
numpy np.newaxis 的实用分享
2019/11/30 Python
详解Anaconda 的安装教程
2020/09/23 Python
英国莱斯特松木橡木家具网上商店:Choice Furniture Superstore
2019/07/05 全球购物
乌克兰在线药房:Аптека24
2019/10/30 全球购物
教师节活动主持词
2014/04/02 职场文书
学校交通安全责任书
2014/08/25 职场文书
2014工程部年度工作总结
2014/12/17 职场文书
六年级学生期末评语
2014/12/26 职场文书
2016春季运动会通讯稿
2015/07/18 职场文书
用Python仅20行代码编写一个简单的端口扫描器
2022/04/08 Python