HTTP Referer二三事

转载 2007年09月25日 15:43:00

HTTP Referer二三事

授权方式:署名,非商业用途,保持一致,转载时请务必以超链接(http://www.fwolf.com/blog/post/320)的形式标明文章原始出处和作者信息及本声明。

什么是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-referer{forge}}
.album.sina.com.cn

这样Gregarius中新浪博客的图片就出来了吧?+hide-referer是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的配置文件,首先设置允许访问的地址,标记下来:

# 只允许来自domain.com的访问,图片可能就放置在domain.com网站的页面上
SetEnvIfNoCase Referer "^http://www.domain.com/" local_ref
# 直接通过地址访问
SetEnvIf Referer "^___FCKpd___3quot; 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二三事

授权方式:署名,非商业用途,保持一致,转载时请务必以超链接(http://www.fwolf.com/blog/post/320) 的形式标明文章原始出处和作者信息及本声明。 什么是HTTP ...
  • neubuffer
  • neubuffer
  • 2013年11月23日 14:31
  • 598

OJ--童年生活二三事

问题及代码: /* *Copyright(c) 2014 烟台大学计算机学院 *All rights reserved. *文件名称:test.cpp *作者:尚 月 *完成日期:2014年...
  • shangyue025
  • shangyue025
  • 2014年12月03日 17:27
  • 1217

zzuli OJ 1091: 童年生活二三事(多实例测试)

Description Redraiment小时候走路喜欢蹦蹦跳跳,他最喜欢在楼梯上跳来跳去。  但年幼的他一次只能走上一阶或者一下子蹦上两阶。  现在一共有N阶台阶,请你计算一下Redra...
  • sinat_25926481
  • sinat_25926481
  • 2015年09月04日 10:23
  • 3985

1091: 童年生活二三事(多实例测试)

1091: 童年生活二三事(多实例测试) Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 4334  Solved: 2473 SubmitS...
  • zzuli_Acmer
  • zzuli_Acmer
  • 2017年09月21日 17:46
  • 205

缓存架构设计细节二三事

本文主要讨论这么几个问题: (1)“缓存与数据库”需求缘起 (2)“淘汰缓存”还是“更新缓存” (3)缓存和数据库的操作时序 (4)缓存和数据库架构简析   一...
  • zhangweikai966
  • zhangweikai966
  • 2016年09月01日 11:22
  • 415

孔子二三事

我很喜欢子贡评价孔子的一段话:    “他人之贤者,丘陵也,犹可逾也;仲尼,日月也,无得而逾焉。人虽欲自绝,其何伤于明月乎?多见其不自量也。”(卷九·子张)     大意就是说,别人的贤德如山丘...
  • github_37483541
  • github_37483541
  • 2017年02月09日 15:21
  • 133

近来二三事 - 20090219

  习惯新闻订阅后,信息涉及的知识领域越来越窄。长此以往,担心一天突然会发现自己早已孤陋寡闻。看来得想想办法才行。  Web2.0的信息时代,信息获取的成本几乎为零。每天被淹没在信息的海洋中,逐渐麻木...
  • CManLH
  • CManLH
  • 2009年02月20日 09:11
  • 460

Javascript 二三事

可能时间不多,作个标记先... Radrails与Aptana联姻,下个月会放出首个合并后的版本。期待ing... Prototype.js推出1.5.1rc2,重点进行性能提升(幅度不小...
  • Rails
  • Rails
  • 2007年03月16日 19:10
  • 915

QT Embedded二三事之QEventLoop

事件是GUI应用的核心概念,GUI应用就是通过执行一个个事件来完成其功能的。围绕事件而设计的事件循环,事件分发,事件截取(hook),这些都是GUI Framework的核心部分和运行的基础,是把其它...
  • s04023083
  • s04023083
  • 2009年10月26日 16:03
  • 1388

YTU 1008: 童年生活二三事

1008: 童年生活二三事 时间限制: 1000 Sec  内存限制: 64 MB 提交: 842  解决: 592 题目描述 Redraiment小时候走路喜欢蹦蹦跳跳,他最喜欢在楼梯上跳来...
  • qq_28954601
  • qq_28954601
  • 2016年01月07日 10:54
  • 629
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:HTTP Referer二三事
举报原因:
原因补充:

(最多只允许输入30个字)