很多投票都有对来路的网址和IP进行验证,但是使用CURL可以伪造成任意的网址与IP,以绕过一些简单的验证,下面举一个简单的例子。
程序运行之前,请确保 php.ini 中 extension=php_curl.dll 没有被注释掉。
test.php
1
<?php
2
$ch
= curl_init();
3
curl_setopt(
$ch
, CURLOPT_URL,
"http://localhost/test_2.php"
);
4
curl_setopt(
$ch
, CURLOPT_HTTPHEADER,
array
(
'X-FORWARDED-FOR:8.8.8.8'
,
'CLIENT-IP:8.8.8.8'
));?
//构造IP
5
curl_setopt(
$ch
, CURLOPT_REFERER,
"http://www.nowamagic.net/ "
);?? //构造来路
6
curl_setopt(
$ch
, CURLOPT_HEADER, 1);
7
$out
= curl_exec(
$ch
);
8
curl_close(
$ch
);
9
?>
test.php 会向 test_2.php 发送请求。
01
<?php
02
function
getClientIp() {
03
if
(!
empty
(
$_SERVER
[
"HTTP_CLIENT_IP"
]))
04
$ip
=
$_SERVER
[
"HTTP_CLIENT_IP"
];
05
else
if
(!
empty
(
$_SERVER
[
"HTTP_X_FORWARDED_FOR"
]))
06
$ip
=
$_SERVER
[
"HTTP_X_FORWARDED_FOR"
];
07
else
if
(!
empty
(
$_SERVER
[
"REMOTE_ADDR"
]))
08
$ip
=
$_SERVER
[
"REMOTE_ADDR"
];
09
else
10
$ip
=
"err"
;
11
return
$ip
;
12
}
13
14
echo
"<br />IP: "
. getClientIp() .
""
;
15
echo
"<br />referer: "
.
$_SERVER
[
"HTTP_REFERER"
];
16
?>
程序运行结果如下:
1
HTTP/1.1 200 OK
Date
: Tue, 01 Nov 2011 12:20:06 GMT
2
Server: Apache/2.2.11 (Win32) DAV/2 mod_ssl/2.2.11
3
OpenSSL/0.9.8i PHP/5.2.9 X-Powered-By: PHP/5.2.9
4
Content-Length: 53 Content-Type: text/html
5
IP: 8.8.8.8
6
referer: http:
//www.nowamagic.net/
看到了吧,IP和地址可以随意换,对于很多投票机制不完善的投票功能都可以使用这个进行刷票了。
顺便说一下,关于真实IP的事情。
一般获得用户IP都是使用$_SERVER['REMOTE_ADDR']这个环境变量,但是此变量只会纪录最后一个主机IP,所以当用户浏览器有设定Proxy时,就无法取得他的真实IP。
这时可以使用另一个环境变量$_SERVER['HTTP_X_FORWARDED_FOR'] ,它会纪录所经过的主机IP,但是只有在用户有透过Proxy时才会产生,所以可以像以下这样写来取得使用者真实IP。
01
<?php
02
if
(
empty
(
$_SERVER
[
'HTTP_X_FORWARDED_FOR'
]))
03
{
04
$myip
=
$_SERVER
[
'REMOTE_ADDR'
];
05
}
06
else
07
{
08
$myip
=
explode
(
','
,
$_SERVER
[
'HTTP_X_FORWARDED_FOR'
]);
09
$myip
=
$myip
[0];
10
}
11
echo
$myip
;
12
?>