通过伪造Referer来解决外链问题

什么是Referer?
Referer是HTTP Header的一个字段,当浏览器向服务器发送请求的时候一般会包含Referer信息,这一字段保存的是访客的来源URI。

以PHP为例,通过输出$_SERVER变量,你就可以看到HTTP_REFERER信息:

如今很多知名的网络相册(如网易相册、百度相册、51相册等等)都限制了外链,我不知道它们用什么方式实现,但是目前而言大多数防盗链的机制都是基于对Referer的判断来实现的。比如说,我有一个网站,其中一个页面地址是 http://example.com/test.html,里面需要外链一张猫扑的图片,因此,image.html里面可以这么写:

但是我们会发现这样外链的图片是无法显示出来的。原因在于,当我们访问http://example.com/test.html时,浏览器会向upload3.mop.com也就是猫扑的服务器发送一个请求,这一请求中包含的Referer信息应该就是这样:

http://example.com/test.html

这样,猫扑的服务器就可以判断出这是一个来自外部网站的请求,从而予以拒绝,这样我们就无法显示这张图片了。

那么,应该如何解决这一问题呢? 用火狐浏览器的可能知道,火狐有个插件叫做RefControl,可以用它来伪造Referer,从而正常显示图片。但是如果你是站长,你总不能要求你的 访客都使用火狐浏览器对吧?即便你所有的访客都使用火狐浏览器,你也很难保证他们都安装了RefControl这个插件。
这样,我们只能从程序方面入手解决问题:

<?php
ob_start();
$img=$_GET['url'];
&nbsp;
$host=$path=str_replace('http://','',$img);
$host=explode('/',$host);
$host=$host[0];
$path=strstr($path,'/');
$fp = fsockopen($host, 80, $errno, $errstr, 30);
if ($fp)
{
	@fputs($fp, "GET $path HTTP/1.1\r\n");
	@fputs($fp, "Host: $host\r\n");
	@fputs($fp, "Accept: */*\r\n");
	@fputs($fp, "Referer: http://$host/\r\n");
	@fputs($fp, "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)\r\n");
	@fputs($fp, "Connection: Close\r\n\r\n");
}
&nbsp;
$Content = '';
while ($str = fread($fp, 4096))
	$Content .= $str;
@fclose($fp);
$pos=strpos($Content,"\r\n\r\n");
$head=substr($Content,0,$pos);
$text=substr($Content,$pos+4);
header($head);
echo $text;
?>

实际上这就是通过伪造Referer来实现我们想要的效果。

我们把这段程序保存为redirect.php,放到服务器上,例如http://example.com/redirect.php,那么,接下来我们只需要将原来的外链图片地址经由这段程序处理,就可以正常显示。

[来源]