首頁 > 後端開發 > php教程 > 限制IP投票的程序,不能用网下搜索的PHP获得客户端IP的代码去获取客户端IP -转载

限制IP投票的程序,不能用网下搜索的PHP获得客户端IP的代码去获取客户端IP -转载

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
發布: 2016-06-13 10:56:31
原創
876 人瀏覽過

限制IP投票的程序,不能用网上搜索的PHP获得客户端IP的代码去获取客户端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("\r\n",$head) ;$head .= "\r\n\r\n"; $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,直接跳转到该用户所在区域的子网站等。

?

?

?

?

?

相關標籤:
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
nginx - X-Forwarded-For 和 X-Real-IP 的差別?
來自於 1970-01-01 08:00:00
0
0
0
java - springboot新手學習
來自於 1970-01-01 08:00:00
0
0
0
spring - JavaWeb中 Service 層的事務問題
來自於 1970-01-01 08:00:00
0
0
0
java - C語言演算法題-韓信點兵 解法?
來自於 1970-01-01 08:00:00
0
0
0
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板