PHP实现的限制IP投票程序IP来源分析

 更新时间:2016年05月04日 09:49:33   作者:看那边  
这篇文章主要介绍了PHP实现的限制IP投票程序,针对投票程序中客户端IP的判断方法进行了深入分析,并给出了伪造IP的方法供大家参考了解,需要的朋友可以参考下

本文实例分析了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 curl用法总结》、《php socket用法总结》、《PHP网络编程技巧总结》、《PHP基本语法入门教程》、《php操作office文档技巧总结(包括word,excel,access,ppt)》、《php日期与时间用法总结》、《php面向对象程序设计入门教程》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总

希望本文所述对大家PHP程序设计有所帮助。

相关文章

  • 一文详解PHP连接MySQL数据库的三种方式

    一文详解PHP连接MySQL数据库的三种方式

    PHP与MySQL的连接有三种API接口,分别是:PHP的MySQL扩展 、PHP的mysqli扩展 、PHP数据对象(PDO)。本文将详解这三种方式的示例代码,需要的可以参考一下
    2022-05-05
  • PHP中Echo结构的用法

    PHP中Echo结构的用法

    PHP echo严格来说是一个语言结构(language construct)而不是一个函数,echo的功用是用来输出字串,是使用率非常高的一个语言结构,特别是未使用样版模式的系统,与echo类似的还有print,两者差别并不大,普通的时候,其实使用echo就可以了
    2022-06-06
  • PHP对象、模式与实践之高级特性分析

    PHP对象、模式与实践之高级特性分析

    这篇文章主要介绍了PHP对象、模式与实践之高级特性,结合实例形式分析了php面向对象程序设计中的静态属性和方法、抽象类、接口、拦截器、克隆对象等概念与简单实现方法,需要的朋友可以参考下
    2016-12-12
  • php Exception异常处理详解

    php Exception异常处理详解

    异常经常被用来处理一些在程序正常执行中遇到的各种类型的错误。比如做数据库链接时,你就要处理数据库连接失败的情况。使用异常可以提高我们程序的容错特性,从而使我们的应用程序更加的稳定和健壮
    2022-11-11
  • PHP使用微信开发模式实现搜索已发送图文及匹配关键字回复的方法

    PHP使用微信开发模式实现搜索已发送图文及匹配关键字回复的方法

    这篇文章主要介绍了PHP使用微信开发模式实现搜索已发送图文及匹配关键字回复的方法,涉及php针对微信json格式数据的解析与正则匹配相关操作技巧,需要的朋友可以参考下
    2017-09-09
  • 用PHP的ob_start();控制您的浏览器cache!

    用PHP的ob_start();控制您的浏览器cache!

    用PHP的ob_start();控制您的浏览器cache!...
    2006-11-11
  • PHP Memcached + APC + 文件缓存封装实现代码

    PHP Memcached + APC + 文件缓存封装实现代码

    PHP Memcached + APC + 文件缓存封装实现代码,需要的朋友可以参考下。
    2010-03-03
  • php编写的mysqli增删改查数据库操作类示例

    php编写的mysqli增删改查数据库操作类示例

    这篇文章主要为大家介绍了php编写的mysqli增删改查数据库操作类示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • PHP中使用asort进行中文排序失效的问题处理

    PHP中使用asort进行中文排序失效的问题处理

    asort() 函数对数组进行排序并保持索引关系。主要用于对那些单元顺序很重要的结合数组进行排序。可选的第二个参数包含了附加的排序标识。如果成功则返回 TRUE,否则返回 FALSE。
    2014-08-08
  • PHP的APC模块实现上传进度条

    PHP的APC模块实现上传进度条

    这篇文章主要介绍了使用PHP的APC模块制作上传进度条,需要的朋友可以参考下
    2015-10-10

最新评论