利用referer防止图片盗链

当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器籍此可以获得一些信息用于处理,不过这个Referer是可以伪造,下面看一个示例,大家就明白了

什么是HTTP Referer

简言之,HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器籍此可以获得一些信息用于处理。比如从我主页上链接到一个朋友那里,他的服务器就能够从HTTP Referer中统计出每天有多少用户点击我主页上的链接访问他的网站。

Referer其实应该是英文单词Referrer,不过拼错的人太多了,所以编写标准的人也就将错就错了。

我的问题

我刚刚把feed阅读器改变为Gregarius,但他不像我以前用的liferea,访问新浪博客的时候,无法显示其中的图片,提示“此图片仅限于新浪博客用户交流与沟通”,我知道,这就是HTTP Referer导致的。

由于我上网客户端配置的特殊性,首先怀疑是squid的问题,但通过实验排除了,不过同时发现了一个Squid和Tor、Privoxy协同使用的隐私泄露问题,留待以后研究。

Gregarius能处理这个问题么?

答案是否定的,因为Gregarius只是负责输出html代码,而对图像的访问是有客户端浏览器向服务器请求的。

不过,安装个firefox扩展也许能解决问题,文中推荐的”Send Referrer”我没有找到,但发现另外一个可用的:”RefControl“,可以根据访问网站的不同,控制使用不同的Referer。

但是我不喜欢用Firefox扩展来解决问题,因为我觉得他效率太低,所以我用更好的方式——Privoxy。

Privoxy真棒

在Privoxy的default.action中添加两行:

{+hide-referrer{forge}}

.album.sina.com.cn

这样Gregarius中新浪博客的图片就出来了吧?+hide-referrer是Privoxy的一个过滤器,设置访问时对HTTP Referer的处理方式,后面的forge代表用访问地址当作Refere的,还可以换成block,代表取消Referer,或者直接把需要用的Referer网址写在这里。

用Privoxy比用Firefox简单的多,赶紧换吧。

From https to http

我还发现,从一个https页面上的链接访问到一个非加密的http页面的时候,在http页面上是检查不到HTTP Referer的,比如当我点击自己的https页面下面的w3c xhtml验证图标(网址为http://validator.w3.org/check?uri=referer),从来都无法完成校验,提示:

No Referer header found!

原来,在http协议的rfc文档中有定义:

代码如下:

15.1.3 Encoding Sensitive Information in URI's

 

Clients SHOULD NOT include a Referer header field in a (non-secure)

HTTP request if the referring page was transferred with a secure

protocol.

 

 

这样是出于安全的考虑,访问非加密页时,如果来源是加密页,客户端不发送Referer,IE一直都是这样实现的,Firefox浏览器也不例外。但这并不影响从加密页到加密页的访问。

Firefox中关于Referer的设置

都在里,有两个键值:

network.http.sendRefererHeader (default=2) 设置Referer的发送方式,0为完全不发送,1为只在点击链接时发送,在访问页面中的图像什么的时候不发送,2为始终发送。参见Privacy Tip #3: Block Referer Headers in Firefox

network.http.sendSecureXSiteReferrer (default=true) 设置从一个加密页访问到另外一个加密页的时候是否发送Referer,true为发送,false为不发送。

 

利用Referer防止图片盗链

 

虽然Referer并不可靠,但用来防止图片盗链还是足够的,毕竟不是每个人都会修改客户端的配置。实现一般都是通过apache的配置文件,首先设置允许访问的地址,标记下来:

# 只允许来自don.com的访问,图片可能就放置在don.com网站的页面上

SetEnvIfNoCase Referer "^http://www.don.com/" local_ref

# 直接通过地址访问

SetEnvIf Referer "^$" local_ref

然后再规定被标记了的访问才被允许:

代码如下:

<FilesMatch ".(gif|jpg)">

Order Allow,Deny

Allow from env=local_ref

</FilesMatch>

 

 

或者

 

代码如下:

<Directory /web/images>

   Order Deny,Allow

   Deny from all

   Allow from env=local_ref

</Directory>

 

 

不要使用Rerferer的地方

 

不要把Rerferer用在身份验证或者其他非常重要的检查上,因为Rerferer非常容易在客户端被改变,不管是通过上面介绍的Firefox扩展,或者是Privoxy,甚至是libcurl的调用,所以Rerferer数据非常之不可信。

如果你想限制用户必须从某个入口页面访问的话,与其使用Referer,不如使用session,在入口页面写入session,然后在其他页面检查,如果用户没有访问过入口页面,那么对应的session就不存在,参见这里的讨论。不过和上面说的一样,也不要过于相信这种方式的“验证”结果。

个人感觉现在Rerferer除了用在防盗链,其他用途最多的就是访问统计,比如统计用户都是从哪里的链接访问过来的等等。

 

 

HTTP-REFERER这个变量已经越来越不可靠了,完全就是可以伪造出来的东东。

以下是伪造方法:

 

PHP(前提是装了curl):

 

 

 代码如下:

$ch = curl_init();

curl_setopt ($ch, CURLOPT_URL, "http://www.d.cn/xxx.asp");

curl_setopt ($ch, CURLOPT_REFERER, "http://www.d.cn/");

curl_exec ($ch);

curl_close ($ch);

 

PHP(不装curl用sock)

$server = 'www.dc9.cn';

$host = 'www.dc9.cn';

$target = '/xxx.asp';

$referer = 'http://www.d.cn/'; // Referer

$port = 80;

$fp = fsockopen($server, $port, $errno, $errstr, 30);

if (!$fp) 

{

echo "$errstr ($errno)<br />n";

else 

{

$out = "GET $target HTTP/1.1rn";

$out .= "Host: $hostrn";

$out .= "Cookie: ASPSESSIONIDSQTBQSDA=DFCAPKLBBFICDAFMHNKIGKEGrn";

$out .= "Referer: $refererrn";

$out .= "Connection: Closernrn";

fwrite($fp, $out);

while (!feof($fp)) 

{

echo fgets($fp, 128);

}

fclose($fp);

}

 

javascript

xmlHttp.setRequestHeader("Referer", "http://URL");//   呵呵~假的~

 

JS不支持^_^

 

原理都是sock构造http头来senddata。其他语言什么的比如perl也可以,

目前比较简单的防御伪造referer的方法是用验证码(Session)。

现在有一些能防盗链软件的商业公司比如UUDOG,linkgate,VirtualWall什么的,都是开发的应用于IIS上面的dll。

有的是采用cookies验证、线程控制,有的是能随机生成文件名然后做URL重写。有的方法能的确达到不错的效果.

不过道高一尺,魔高一丈,这些雕虫小技终归是有破解方法的。

一般的就是这样的了,但是服务器就不好实现伪造,只能制造不多的数据了,如果可以实现访问网页就可以伪造,那就可以实现了真正的伪造,实现自然IP分布。

时间: 2024-08-03 13:23:18

利用referer防止图片盗链的相关文章

使用php伪造referer的方法 利用referer防止图片盗链_php实例

什么是HTTP Referer简言之,HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器籍此可以获得一些信息用于处理.比如从我主页上链接到一个朋友那里,他的服务器就能够从HTTP Referer中统计出每天有多少用户点击我主页上的链接访问他的网站.Referer其实应该是英文单词Referrer,不过拼错的人太多了,所以编写标准的人也就将错就错了.我的问题我刚刚把feed阅读器改变为Grega

实用技巧 利用Apache实现禁止图片盗链

1.假设充许连结图片的主机域名为:www.webjx.com 2.修改httpd.conf SetEnvIfNoCase Referer "^http://www.webjx.com/" local_ref=1 <FilesMatch ".(gif|jpg)"> Order Allow,Deny Allow from env=local_ref </FilesMatch> 这个简单的应用不光可以解决图片盗链的问题,稍加修改还可以防止任意文件盗

利用Apache实现禁止图片盗链

1.假设充许连结图片的主机域名为:www.webjx.com 2.修改httpd.conf 以下为引用的内容:SetEnvIfNoCase Referer "^http://www.webjx.com/" local_ref=1 <FilesMatch ".(gif|jpg)"> Order Allow,Deny Allow from env=local_ref </FilesMatch>  这个简单的应用不光可以解决图片盗链的问题,稍加修改

使用referer指令配置Nginx服务器来防止图片盗链_nginx

由于nginx不支持.htaccess,所以,从这个方面直接去防止是行不通的,我们要通过修改配置文件来解决. 首先,我们找到需要防盗链的域名的conf文件,路径:/usr/local/nginx/conf/vhost/,比如guance.com.conf.先备份下原文件,然后找到下面的部分: location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { expires 30d; } 将它修改为: location ~ .*\.(gif|jpg|jpeg|png|bmp

php如何控制用户对图片的访问 PHP禁止图片盗链_php技巧

把images目录设置成不充许http访问(把图片目录的:读取.目录浏览 两个权限去掉). 用一个PHP文件,直接用file函数读取这个图片.在这个PHP文件里进行权限控制. apache环境中,在你的图片目录中加上下面这个文件即可. 文件名 .htaccess 文件内容如下 复制代码 代码如下: # options the .htaccess files in directories can override. # Edit apache/conf/httpd.conf to AllowOve

禁止图片盗链

1.假设充许连结图片的主机域名为:www.test.com 2.修改httpd.conf  SetEnvIfNoCase Referer "^http://www.test.com/" local_ref=1 <FilesMatch ".(gif|jpg)"> Order Allow,Deny Allow from env=local_ref </FilesMatch>    这个简单的应用不光可以解决图片盗链的问题,稍加修改还可以防止任意文

Apache 实现禁止图片盗链

apache 在其它论坛上看到的.虽然文档里有记录,但还是收录它.方便我以后查询 1.假设充许连结图片的主机域名为:www.webjx.com 2.修改httpd.conf  SetEnvIfNoCase Referer "^http://www.webjx.com/" local_ref=1 <FilesMatch ".(gif|jpg)"> Order Allow,Deny Allow from env=local_ref </FilesMat

PHP禁止图片盗链

1.假设充许连结图片的主机域名为:www.test.com 2.修改httpd.conf  SetEnvIfNoCase Referer "^http://www.test.com/" local_ref=1 <FilesMatch ".(gif|jpg)"> Order Allow,Deny Allow from env=local_ref </FilesMatch>    这个简单的应用不光可以解决图片盗链的问题,稍加修改还可以防止任意文

Apache服务器下防止图片盗链的办法_php技巧

先解释一下图片防盗链和转向: 图片防盗链有什么用? 防止其它网站盗用你的图片,浪费你宝贵的流量. 图片转向有什么用? 如果你的网站以图片为主,哪天发现月底没到流量就快用光了,那就可以利用图片转向,在不修改网页的前提下,把图片下载请求转向到其它空间(比如试用主机),临时过渡. 下面开始讲解,比如你的图片都在img目录下,那就在该目录下放一个名为 .htaccess 的文件,内容如下: RewriteEngine on RewriteCond %{HTTP_REFERER} !^$ [NC] Rew