PHP伪造IP与HTTP Referer方法

PHP 的 HTTP 求头伪造方法挺实用的,尤其是在做数据采集、自动化测试这些活儿的时候。你想模拟一下用户来源、换个 IP 去刷个投票,或者伪装爬虫都能用得上。而且实现起来也不麻烦,用cURL或者Socket搞定 Referer 伪造,几行代码就能跑通。要改 IP 地址就加几个求头字段就行,X-Forwarded-ForClient-IP 用得最多,多简单服务压根儿识别不出来真假。

Referer 伪造最方便的是用cURL,像这样:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.example.com/xxx.asp");
curl_setopt($ch, CURLOPT_REFERER, "http://www.example.com/");
curl_exec($ch);
curl_close($ch);

或者你要底层点,也可以用Socket直接拼头:

$fp = fsockopen('www.example.com', 80, $errno, $errstr, 30);
$out = "GET /xxx.asp HTTP/1.1\r\n";
$out .= "Host: www.example.com\r\n";
$out .= "Referer: http://www.example.com/\r\n";
$out .= "Connection: Close\r\n\r\n";
fwrite($fp, $out);
while (!feof($fp)) echo fgets($fp, 128);
fclose($fp);

IP 伪造这块就稍微讲究点,用X-Forwarded-ForClient-IP加头最常见。要是你喜欢用file_get_contents()那种,也能用stream_context_create()传头:

$opts = [
  'http' => [
    'method' => "GET",
    'header' => "Referer: http://www.example.com\r\n" .
                "X_FORWARDED_FOR: 12.235.57.101\r\n" .
                "CLIENT_IP: 12.235.57.101\r\n"
  ]
];
$context = stream_context_create($opts);
file_get_contents("http://www.example.com/test/server_info.php", false, $context);

要注意哦,这种伪造方法对高防站效果一般。大平台往往会对X-Forwarded-For这类字段进行验证,甚至直接从源 IP 判断。所以如果你是在正式项目里搞这个,最好提前测试下效果。哦对了,别用来干坏事哈。

如果你平时要做接口测试、模拟流量、写爬虫,还蛮推荐你试试这些方法,搭配一些现成的 HTTP 类库效果更好,比如 YurunHttp 就挺不错。

txt 文件大小:2.51KB