代码改变世界

PHP用CURL或fsockopen伪造IP和来路(referer)

2013-08-07 14:03  youxin  阅读(1840)  评论(0编辑  收藏  举报

URL是一个利用URL语法规定来传输文件和数据的工具,支持很多协议,如HTTP、FTP、TELNET等。最爽的是,PHP也支持 CURL库。

我们可以用CURL来伪造IP和来路,例子:1.php 请求 2.php 。

CURLOPT_HTTPHEADER

一个用来设置HTTP头字段的数组。使用如下的形式的数组进行设置: array('Content-type: text/plain', 'Content-length: 100')

如;

curl_setopt($chCURLOPT_HTTPHEADERS,array('Content-Type: application/json'));

或者array是其他的形式。CURLOPT_HTTPHEADER还可以来配置设置host访问。

1.php

<?Php
$ch=curl_init();
curl_setopt($ch,CURLOPT_URL,'http://localhost/php/webCrawl/receiveCurlSet.php');
curl_setopt($ch,CURLOPT_HTTPHEADER, array('X-FORWARDED-FOR:8.8.8.8', 'CLIENT-IP:8.8.8.8'));  //构造IP
curl_setopt($ch,CURLOPT_REFERER,'http://www.baidu.com');
curl_setopt($ch,CURLOPT_HEADER,0);
$out=curl_exec($ch);
print $out;
curl_close($ch);
?>
receiveCurlSet.php
<?Php
function getClientIp() {
     
    if (!empty($_SERVER["HTTP_CLIENT_IP"]))
        $ip = $_SERVER["HTTP_CLIENT_IP"];
    else if (!empty($_SERVER["HTTP_X_FORWARDED_FOR"]))
        $ip = $_SERVER["HTTP_X_FORWARDED_FOR"];
    else if (!empty($_SERVER["REMOTE_ADDR"]))
        $ip = $_SERVER["REMOTE_ADDR"];
    else
        $ip = "err";
     
        
    return $ip;
}
echo "IP: " . getClientIp() . "";
echo "referer: " . $_SERVER['HTTP_REFERER'];
?>

输出:

IP: 8.8.8.8referer: http://www.baidu.com1

不知道后面为什么多了一个1.

还有,我们接收 的php文件,是用的getClientIp函数,如果用

$_SERVER["REMOTE_ADDR"]

是不能显示我们设置8.8.8.8的。因为REMOTe_ADDR是查看客户端物理IP地址的,这个我们无法模拟

还可以用fsockopen来设置,参考http://yige.org/p/463。


注意:
如果是header的话,是没有referer的。
即:
在a页面:

<?php
 
header("Location:http://localhost/php/webCrawl/301Redirect2.php");
?>

301Redirect2.php 页面

 echo $_SERVER['HTTP_REFERER'];

会报错:

Undefined index: HTTP_REFERER。

 原因是什么,不知道。

我们通过搜索引擎搜索结果,点击页面,该页面是新开的页面,但是有referer属性。如百度的:

Referer:
http://www.baidu.com/s?wd=+%E9%85%B7%E5%A3%B3&rsv_bp=0&ch=&tn=baidu&bar=&rsv_spt=3&ie=utf-
我们可以通过这个方法检测到底是由哪个搜索引擎进入该页面的。可以看http://coolshell.cn/articles/9308.html酷壳的这篇文章。