RSS
  • 首页
  • 关于

与标签 ‘外链’ 相关的文章

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

一月 8, 2010 by admin | 0 Comment »

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

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

图1

图1

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

1
<img src="http://upload3.mop.com/upload3/2009/12/18/08/1261139622733.jpg"/>

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

http://example.com/test.html

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?php
ob_start();
$img=$_GET['url'];
 
$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");
}
 
$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,那么,接下来我们只需要将原来的外链图片地址经由这段程序处理,就可以正常显示。

1
<img src="http://example.com/redirect.php?url=http://upload3.mop.com/upload3/2009/12/18/08/1261139622733.jpg"/>

效果如下:

图2

图2

由此可见,Referer信息不一定可靠,因为它是可以伪造出来的,通过这一手段来防盗链并不是一个完美的办法。
同时,我们也应该尽可能少的外链文件,毕竟大多数服务器都有带宽的限制和成本的考虑,限制外链对它们的生存也是很重要的。


PHP, Web | Tags: 外链, 盗链


IT狂人的博客

  • 声明

    本博文章及相关作品(包括但不限于文字、图片),除特别说明为转载外,均属本人原创,依据《国家知识产权法》、《著作权法》和《信息网络传播权保护条例》,原创知识产权、版权均为本人所有,本人享有著作权,并受法律保护。

    文章欢迎转载,但请事先与本人联系:email
    未经本人许可,任何人不得转载或使用整体或任何部分的内容。未尽事宜,依据相关法律法规处理。

  • 分类目录

    • ASP .Net (1)
    • CodeIgniter (8)
    • PHP (8)
    • Web (5)
    • 未分类 (1)
    • 杂谈 (4)
    • 译文 (7)
    • 音乐&电影 (1)
  • 文章索引模板

    • 2010年七月 (5)
    • 2010年五月 (1)
    • 2010年四月 (1)
    • 2010年三月 (2)
    • 2010年二月 (1)
    • 2010年一月 (2)
    • 2009年十二月 (1)
    • 2009年十月 (2)
    • 2009年九月 (3)
    • 2009年八月 (10)
  • 标签

    AJAX API AVC CakePHP CHM CodeIgniter CURD Django DroidSansFallback eaccelerator footer Framework Fran Healy Git helper IT Kohana MVC MVP MYSQL NetBeans Oasis ORM pChart pdf PHP phpMyAdmin Ruby tcpdf techified time Travis Twitter Web windows Wordpress XML Zend 传记 外链 大写 孔乙己 框架 盗链 过滤
  •  

    2010年七月
    一 二 三 四 五 六 日
    « 五    
     1234
    567891011
    12131415161718
    19202122232425
    262728293031  
  • Playlist


  • 最近评论

    • cnenc 在 使用PHP的Glob()函数来遍历文件夹 上的评论
    • TCPDF开源项目 - PDF - php开源项目 - php免费pdf生成软件 - php开源软件 - TCPDF - 开源网 在 使用TCPDF输出完美的中文PDF文档 上的评论
    • 匿名 在 在Windows下编译适用于PHP 5.2.12及5.2.13的eAccelerator.dll(附下载) 上的评论
    • 笑话大王 在 使用TCPDF输出完美的中文PDF文档 上的评论
    • admin 在 在Windows下编译适用于PHP 5.2.12及5.2.13的eAccelerator.dll(附下载) 上的评论
  • 链接

    • cnBeta.COM
    • CodeIgniter 中国
    • jQuery中文社区
    • Lily Allen
    • Mtime时光网
    • W3School
    • 小众软件
    • 破烂熊乐园
    • 韩寒
Copyright © 2010 IT狂人的博客 All Rights Reserved. XHTML CSS THEME by I SOFTWARE REVIEWS