`

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-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的设置

都在<about :config="">里,有两个键值:</about>

  • 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 "^$" 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除了用在防盗链,其他用途最多的就是访问统计,比如统计用户都是从哪里的链接访问过来的等等。

分享到:
评论

相关推荐

    csrf绕过Referer技巧-01

    CSRF绕过Referer技巧详解 CSRF(Cross-Site Request Forgery,跨站请求伪造)是一种常见的Web攻击方式,攻击者可以通过构造恶意页面诱骗用户执行非法操作。为了防御CSRF攻击,Web开发者通常会使用Referer头来判断...

    nginx利用referer指令实现防盗链配置

    本文将详细介绍如何利用 Nginx 的 `referer` 指令进行防盗链配置。 `Referer` 字段在 HTTP 请求头中用于指示用户是从哪个 URL 跳转到当前请求的页面的。在图片防盗链的场景下,如果 Nginx 服务器接收到一个请求,其...

    Android CordovaWebview Add Header Referer

    本代码是处理android hybrid混合应用,遇到的webview 拦截 header referer 问题的解决。 场景:angular $HTTP 或者js的http请求或者其他。。webview成功拦截get 、post、delete请求,添加header,referer以及body ...

    javascript操作referer详细解析

    JavaScript中的`referer`是一个关键的HTTP头部字段,它记录了用户从哪个URL访问了当前页面。这个信息对于网站分析、追踪用户来源以及了解流量来源至关重要。在JavaScript中,我们可以使用`document.referrer`来获取...

    request.getHeader("referer")防盗链

    例如,如果你在A网站点击了一个链接跳转到B网站,B网站的服务器就能通过"Referer"头了解到用户是从A网站来的。这个信息对于分析用户行为、追踪流量来源等具有重要意义。 然而,"Referer"头同样可以被用来实施防盗链...

    IE BHO插件,修改referer

    为了在每次导航时修改`Referer`,我们需要在BHO的`IBrowserService`实现中监听`BeforeNavigate2`事件。当用户点击链接或者通过其他方式改变URL时,这个事件会被触发。在事件处理函数中,我们可以获取到即将发送的...

    HTTP Referer详解及Referer控制

    使用Meta标签控制Referer的方式十分灵活,可以通过设置为“never”来禁止发送任何Referer信息,或者设置为“always”、“origin”、“default”等,以达到不同程度的控制。这种控制方式对于保护用户隐私以及防止敏感...

    laravel-referer, 记住原始访问者引用者.zip

    laravel-referer, 记住原始访问者引用者 记得一个访问者引用者 在会话中记住访问者的原始引用者。 引用程序为( 优先优先级优先):utm_source 查询参数如果URL中存在外部主机,则来自请求头的Referer的域空白安装你...

    通过修改referer下载文件的方法

    `Referer`头通常用于服务器追踪用户从哪个页面访问当前请求的资源,但在某些情况下,我们可以利用它来解决特定的限制或安全策略。 描述中提到的问题是,在使用XMLHttpRequest(通常称为Ajax)进行文件下载时,如果...

    Java 通过设置Referer反盗链

    当用户从一个外部链接访问网站资源时,浏览器通常会在请求头中携带`Referer`字段,表明是从哪个页面发起的请求。如果`Referer`不在允许的列表内,网站服务器就会拒绝提供资源。 Java中,我们可以利用`java.net....

    laravel-referer:记住访问者的原始referer

    如果URL中存在外部主机,则来自请求的Referer标头中的域 空的 支持我们 我们投入了大量资源来创建。 您可以通过来支持我们。 非常感谢您从家乡寄给我们一张明信片,其中提到您使用的是哪个包装。 您可以在上找到...

    超全面javaweb教程28天第10天 12 request之使用Referer请求头完成防盗链

    超全面javaweb教程28天第10天_12_request之使用Referer请求头完成防盗链

    php 伪造IP和HTTP-REFERER的方法

    $out .= "Referer: $referer\r\n"; $out .= "Connection: Close\r\n\r\n"; fwrite($fp, $out); while (!feof($fp)) { echo fgets($fp, 128); } fclose($fp); } ``` - **解释**: 这段代码通过`fsockopen()`...

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

    标题中的“使用PHP伪造Referer的方法 利用Referer防止图片盗链”涉及到的是Web开发中的HTTP头部信息处理,特别是如何使用PHP来控制和利用HTTP Referer字段来防止图片资源被其他网站非法引用,即图片盗链。...

    ASP,PHP与.NET伪造HTTP-REFERER方法及防止伪造REFERER的方法

    $out .= "Referer: $referer\r\n"; $out .= "Connection: Close\r\n\r\n"; fwrite($fp, $out); while (!feof($fp)) { echo fgets($fp, 128); } fclose($fp); } ``` #### .NET环境中的HTTP-REFERER伪造 在...

    IE下通过a实现location.href 获取referer的值

    然而,在不同的浏览器和特定情况下,`Referer` 的行为可能有所不同,尤其是在Internet Explorer(IE)中。 标题提到的问题在于,当在IE浏览器中使用`window.location.href`进行页面跳转时,`Referer`头字段可能不会...

    PHP伪造referer实例代码

    然后,使用 `fsockopen` 函数连接目标主机,并构建伪造的 Referer 信息,包括 `Host`、`Referer` 和 `User-Agent`。 模拟 HTTP 请求 代码使用 `fputs` 函数将伪造的 Referer 信息发送到目标主机,并模拟一个 GET ...

    selenium-referer:在使用Python和WebDriver的Selenium测试中添加Referer请求标头的示例

    具有自定义Referer标头的Python Selenium测试 有时,当用户来自不同来源/搜索引擎时,网站需要具有不同的行为。 在我的用例中,我们的网站必须设置一个跟踪Cookie,该跟踪Cookie对于来自Google,AOL,Yahoo或MSN的...

    mod_access_referer.nasl

    mod_access_referer

    完美兼容各大浏览器获取HTTP_REFERER方法总结

    echo "referer: " . $_SERVER["HTTP_REFERER"]; ?&gt; ``` 在这个例子中,我们使用cURL初始化一个会话,并设置请求头来包含伪造的IP和HTTP_REFERER。然后,通过`curl_exec`执行请求,服务器端的`ip.php`文件将接收到...

Global site tag (gtag.js) - Google Analytics