`

HTTP 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的配置文件,首先设置允许访问的地址,标记下来:

# 只允许来自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>

这方面的文章网上很多,参考:

    * Apache 下防止盗链的解决办法
    * Apache的环境变量设置
    * 配置 Apache 实现禁止图片盗链

不要使用Rerferer的地方

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

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

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

相关推荐

    csrf绕过Referer技巧-01

    服务器可以根据Referer值来判断请求是否来自合法的域名,如果不相关则不执行操作。 二、Referer防御代码编写 在PHP中,可以使用 `$_SERVER['HTTP_REFERER']` 获取页面提交请求中的Referer值。例如: ```php if ...

    php 伪造IP和HTTP-REFERER的方法

    ### PHP 伪造IP和HTTP-REFERER的方法 #### 背景介绍 在网络环境中,IP地址和HTTP_REFERER(HTTP-REFERER)是两种常见的用于跟踪和识别用户请求的数据。其中,IP地址通常用来标识网络中的设备;而HTTP_REFERER则记录...

    让https网站发送 referrer https 与 http 跳转 referer 的问题

    - default: 使用浏览器默认行为,这通常与当前页面的协议有关。 - always: 总是发送完整的referrer信息。 举例来说,如果希望当前页面中的所有请求都不发送referrer,可以使用如下元标签: ```html ``` 如果希望...

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

    标题中的“通过修改referer下载文件的方法”指的是在HTTP请求中,通过设置请求头中的`Referer`字段来伪装来源页面,从而实现特定的文件下载需求。`Referer`头通常用于服务器追踪用户从哪个页面访问当前请求的资源,...

    php中突破基于HTTP_REFERER的防盗链措施(stream_context_create)

    综上所述,突破基于HTTP_REFERER的防盗链措施涉及到对HTTP请求头的修改,以及对PHP相关函数和配置的深入理解。需要注意的是,虽然技术上可以实现突破防盗链,但在实际应用中应该尊重网站的版权和资源使用协议,以免...

    Java 通过设置Referer反盗链

    防盗链主要是通过检查HTTP请求头中的`Referer`字段来实现的。当用户从一个外部链接访问网站资源时,浏览器通常会在请求头中携带`Referer`字段,表明是从哪个页面发起的请求。如果`Referer`不在允许的列表内,网站...

    PHP伪造来源HTTP_REFERER的方法实例详解

    本文通过实例讲解了如何在PHP中伪造HTTP_REFERER,并阐述了相关的技巧和注意事项,同时提供了防御这类攻击的方法。 首先,我们来了解HTTP_REFERER的含义。HTTP_REFERER是HTTP协议中的一个头部字段,它记录了用户...

    如何增加Referer功能--反向链接插件

    具体来说,需要前往`http://svn.referer.cn/referer_lite/package/`下载一个名为`referer_lite.rar`的压缩包。这个压缩包包含了所有必需的文件和配置脚本。 ##### 第二步:上传与配置 解压下载的压缩包之后,将其中...

    Referer Privacy-crx插件

    有关引荐来源标头的更多信息,请参见https://en.wikipedia.org/wiki/HTTP_referer。此扩展使用AngularJS和URI.js。 两者的许可证如下所示:AngularJS:MIT许可证版权所有(c)2010-2016 Google,Inc. http://angular

    主机验证:用于“主机”和“ Referer”标头验证的Express.js中间件,可防止DNS重新绑定攻击

    如果请求不包含列入白名单的Host / Referer标头,则host-validation将以403 Forbidden HTTP错误响应。 DNS重新绑定是一个精明的漏洞利用,多年来一直没有得到应有的重视。 因此,由于开发人员缺乏有关攻击的知识,...

    php中XMLHttpRequest(Ajax)不能设置自定义的Referer的解决方法

    在使用 cURL 设置自定义 Referer 时,开发者需要了解 cURL 相关的选项设置。CURLOPT_HTTPHEADER 选项允许开发者指定一个数组,用以自定义 HTTP 头。要设置自定义的 Referer,需要在这个数组中加入 'Referer' 键值对...

    noreferrer去除网页跳转refer

    至于压缩包文件`noreferrer-master`,可能包含了一个关于如何在项目中实现和使用`noreferrer`属性的示例代码库或教程,包括但不限于JavaScript、HTML、CSS等前端技术,也可能涉及服务器端的相关处理。为了深入学习,...

    JSP获取HTTP header信息(request)例子

    下面将详细介绍JSP中如何获取HTTP请求头信息及其相关的知识点。 #### 一、HTTP请求头简介 HTTP请求头(Request Headers)是HTTP请求的一部分,它包含了客户端向服务器发送的元数据。这些元数据可以帮助服务器更好...

    详解Android Webview加载网页时发送HTTP头信息

    今天,我们详细介绍了 Android Webview 加载网页时发送 HTTP 头信息的相关知识点,包括 Referer 头信息和 UserAgent 头信息。我们也学习了如何使用 loadUrl 方法和 extraHeaders 参数来发送 HTTP 头信息。在实际开发...

    PHP利用REFERER根居访问来地址进行页面跳转

    本篇文章将详细介绍如何利用PHP的HTTP_REFERER头信息进行条件性的页面跳转,并探讨相关的编程实践。 HTTP_REFERER是HTTP协议头部的一个字段,它包含了用户从哪个URL访问当前页面的信息。在某些场景下,我们可以根据...

    liferay-apps-content-targeting-referer:Liferay 受众定位自定义规则

    例如,如果 Referer 头中包含了 "example.com",那么可以推断用户是从 example.com 网站来的,此时 Liferay 可以据此显示与 example.com 合作伙伴相关的广告或内容,提升用户体验的同时,也可能提高合作效果。...

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

    文章中首先介绍了一些关于Nginx配置的基本知识,然后重点讲解了如何通过修改配置文件来设置防盗链,最后补充了有关referer指令的一些语法和参数,帮助读者更好地理解和应用。 Nginx是一个高性能的HTTP和反向代理...

    [其他类别]PHP防图片盗链程序_script.zip

    1. 检查Referer:通过PHP的$_SERVER全局变量获取HTTP头信息,尤其是'Referer'字段。如果Referer字段为空或者不包含预期的域名,可以阻止图片显示。 ```php $referer = $_SERVER['HTTP_REFERER']; $allowed_domains ...

    推荐人的隐私「Referer Privacy」-crx插件

    有关引荐来源标头的更多信息,请参见https://en.wikipedia.org/wiki/HTTP_referer。此扩展使用AngularJS和URI.js。 两者的许可证如下所示:AngularJS:MIT许可证版权所有(c)2010-2016 Google,Inc. ...

    PHP 获取从搜索引擎进来的关键字

    $referer = $_SERVER['HTTP_REFERER']; if (strpos($referer, 'baidu.com') !== false) { $params = parse_url($referer, PHP_URL_QUERY); parse_str($params, $query); $keyword = isset($query['wd']) ? $query...

Global site tag (gtag.js) - Google Analytics