PHP实现的限制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.phpHTTP/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; } printjoin('',$response);
执行这段代码,可以得知,服务器端(localhost/i.php)打印了255.255.255.255。
说明了这种获取客户端IP的方法在限制IP的投票活动里是不可取的,客户端的IP地址可用伪造。而直接使用 $_SERVER['REMOTE_ADDR']虽然获取到的不是用户的最终IP地址,但是限制的功能是直接有效的达到了。
当然,也不能说那段代码是错误的。在一些对IP不做限制的需求里,应该使用,比如,在一些有很多地域性子网站的网站,通过用户访问的IP,直接跳转到该用户所在区域的子网站等。
更多关于PHP相关内容感兴趣的读者可查看本站专题:《phpcurl用法总结》、《phpsocket用法总结》、《PHP网络编程技巧总结》、《PHP基本语法入门教程》、《php操作office文档技巧总结(包括word,excel,access,ppt)》、《php日期与时间用法总结》、《php面向对象程序设计入门教程》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》
希望本文所述对大家PHP程序设计有所帮助。