HTTP Referer详解及Referer控制

什么是HTTP Referer

referer的意思简言之,HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器籍此可以获得一些信息用于处理。

比如在一个网页里面插入一个超链接,链接到其他的网页,那么当点击这个超链接从而链接到另外一个页面的时候,相当于浏览器向 web 服务器发送了一个 http 请求,对于另外一个页面而言,这个 referer 就是上一个页面的 URL,而对于从地址栏里面直接输入 URL 或者是刷新网页的方式,则 referer = null,通过设置这个 referer 可以防止盗链的问题

例如从我主页上链接到一个朋友那里,他的服务器就能够从HTTP Referer中统计出每天有多少用户点击我主页上的链接访问他的网站。

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

Referer有时也被用作防盗链

即下载时判断来源地址是不是在网站域名之内, 否则就不能下载或显示,很多网站,如天涯就是通过Referer页面来判断用户是否能够下载图片.

当然,对于某些恶意用户,也可能伪造Referer来获得某些权限,在设计网站时要考虑到这个问题.

还可用做电子商务网站的安全,在提交信用卡等重要信息的页面用referer来判断上一页是不是自己的网站,如果不是,可能是黑客用自己写的一个表单,来提交,为了能跳过你上一页里的javascript的验证等目的。

但是注意不要把Rerferer用在身份验证或者其他非常重要的检查上,因为Rerferer非常容易在客户端被改变

虽然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>

哪些情况下无法获得上一页referrer信息

直接在浏览器地址栏中输入地址;

使用location.reload()刷新(location.href或者location.replace()刷新有信息);

在微信对话框中,点击链接进入微信自身的浏览器;

扫码进入QQ或者微信的浏览器;

直接新窗口打开一个页面; 2017.8.3更新 新版本Chrome测试,新窗口页面依然有document.referrer

从https的网站直接进入一个http协议的网站(Chrome下亲测);

a标签设置rel="noreferrer"(兼容IE7+);

meta标签来控制不让浏览器发送referer;

例如:

<meta content="never" name="referrer">

使用 Referer Meta 标签控制 referer

使用场景

在某些情况下,出于一些原因,网站想要控制页面发送给 server 的 referer 信息的情况下,可以使用这一 referer metadata 参数。

隐私

社交网站一般都会有用户个人页面,这些页面中用户都有可能添加一些外网的链接,而社交网站有可能不希望在用户点击了这些链接的时候,泄露用户页面的 URL ,因为这些 URL 中可能包含一些敏感信息。当然,有些社交网站可能只想在 referer 中提供一个 hostname,而不是完整的 URL 信息。

安全

有些使用了 https 的网站,可能在 URL 中使用一个参数(sid 等)来作为用户身份凭证,而又需要引入其他 https 网站的资源,这种情况下,网站肯定不希望泄露用户的身份凭证信息。

Object-Capability Discipline

有些网站遵循Object-Capability Discipline,而 referer 刚好与这一策略相悖,所以,网站能够控制 refeer 将对 Object-Capability Discipline 很有利。

技术细节

referer 的 metedata 参数可以设置为以下几种类型的值:

never
always
origin
default

如果在文档中插入 meta 标签,并且 name 属性的值为 referer,浏览器客户端将按照如下步骤处理这个标签:

1.如果 meta 标签中没有 content 属性,则终止下面所有操作

2.将 content 的值复制给 referrer-policy ,并转换为小写

3.检查 content 的值是否为上面 list 中的一个,如果不是,则将值置为 default

上述步骤之后,浏览器后续发起 http 请求的时候,会按照 content 的值,做出如下反应(下面 referer-policy 的值即 meta 标签中 content 的值):

1.如果 referer-policy 的值为never:删除 http head 中的 referer;

2.如果 referer-policy 的值为default:如果当前页面使用的是 https 协议,而正要加载的资源使用的是普通的 http 协议,则将 http header 中的 referer 置为空;

3.如果 referer-policy 的值为 origin:只发送 origin 部分;

4.如果 referer-policy 的值为 always:不改变http header 中的 referer 的值,注意:这种情况下,如果当前页面使用了 https 协议,而要加载的资源使用的是 http 协议,加载资源的请求头中也会携带 referer。

例子

如果页面中包含了如下 meta 标签,所有从当前页面中发起的请求将不会携带 referer:

<meta name="referrer" content="never">

如果页面中包含了如下 meta 标签,则从当前页面中发起的 http请求将只携带 origin 部分(注:根据原文中的语境,我理解这里的 origin 是包含了 schema 和 hostname 的部分 url,不包含 path 等后面的其他 url 部分),而不是完整的 URL :

<meta name="referrer" content="origin">

注意:在使用本文中所述的 meta 标签的时候,浏览器原有的 referer 策略将被打破,比如从 http 协议的页面跳转到 https 的页面的时候,如果设置了适当的值,也会携带 referer。

其他问题

这与 rel=noreferer 有什么关系呢?可能 rel=noreferer 会覆盖掉本文中的 meta 标签所设置的值。也就是功能覆盖。
origin 信息不是一个完整的 url,所以浏览器客户端估计会在 origin 后面加一个 / 来作为 path 部分。
如果 origin 是唯一的,会发生什么情况呢?估计 referer 会被忽略。

(0)

相关推荐

  • php中HTTP_REFERER函数用法实例

    本文实例分析了php中HTTP_REFERER函数用法.分享给大家供大家参考.具体分析如下: 利用php的http_referer函数来判断用户的来路,这是比较简单的,实例代码如下: 复制代码 代码如下: <?php    if (isset($_SERVER['HTTP_REFERER'])) {      print "The page you were on previously was {$_SERVER['HTTP_REFERER']}<br />";   

  • VBS伪造HTTP-REFERER的实现方法

    在测试目录写了一个简单的referer.php,代码如下 复制代码 代码如下: <?php if (!isset($_SERVER["HTTP_REFERER"])) echo "No Referer"; else echo $_SERVER["HTTP_REFERER"]; ?> 如果直接点击上面的链接,那么页面会显示referer页面的链接. 复制代码 代码如下: Set http = CreateObject("msx

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

    后来查了一些相关资料,发现在IE 中通过 window.location.href 或者是 是无法获取HTTP_REFERER, 真是搞不懂 IE 的浏览器,很多浏览器运行的很好的东西,它就是不支持,最后没有办法,只能PHP伪造来源HTTP_REFERER的方法或者用JS来伪造. IE可以识别的 HTTP_REFERER 提交是通过click 触发的事件或者是 Form 表单提交的请求,下面是根据网上的资料总结的一个方法: <script> function referURL(url){ va

  • asp Http_Referer,Server_Name和Http_Host

    刚才运行了一段代码,来查看Request.ServerVariables里面有多少值,看了一下,共50个! 代码<%=Request.ServerVariables.count%> 以前感觉Request.ServerVariables里的值很多,现在看看还是那么多,不过今天谈其中的一个值----HTTP_Referer 首先,我们先知道HTTP_Referer最常用的应用就是能够防止外部提交. 下列情况是从浏览器的地址栏正常取得Request.ServerVariables("HT

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

    解决方法: 使用服务器作为代理. 在PHP中, 使用我最喜欢的最强大的CURL,嘿嘿 下面是在万网查询域名的实例代码 复制代码 代码如下: <?php $dn = $_GET['dn']; // 域名, 不包括www $ex = $_GET['ex']; // 顶级域名, 如 .com, .cn, 包括最前面的. // 查询域名是否已经注册 $url = 'http://pandavip.www.net.cn/check/check_ac1.cgi'; $ch = curl_init($url)

  • 一段ASP的HTTP_REFERER判断代码

    只要不是HTTP_REFERER来源于(google.com google.cn *.google.com *.google.cn baidu.com *.baidu.com)这些网址来源的请求,就通通转发至404 复制代码 代码如下: <% Dim a, reg a = Request.ServerVariables("HTTP_REFERER").Item Set reg = New RegExp reg.Pattern = "^http://(?:[^.]*\.)

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

    那么如果考虑突破防盗链的措施,就需要考虑在 HTTP_REFERER 上面做手脚了.PHP 脚本中对应的变量是 $_SERVER['HTTP_REFERER'] ,它存储了 HTTP_REFERER 的值. 由于直接访问目标 URL 资源已经被上述防盗链的措施给屏蔽,所以我们需要个类似网关的玩意去获取.说白了就是编写已经包装过的 HTTP 头的 PHP 脚本. 下面是简单的函数实现: 复制代码 代码如下: function getRemoteFile($url, $refer = '') { $

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

    HTTP-REFERER这个变量已经越来越不可靠了,完全就是可以伪造出来的东东. 以下是伪造方法: ASP/Visual Basic代码 dim http      set http=server.createobject("MSXML2.XMLHTTP") '//MSXML2.serverXMLHTTP也可以     Http.open "GET",url,false      Http.setRequestHeader "Referer",&

  • php 伪造HTTP_REFERER页面URL来源的三种方法

    php获取当前页面的前一个页面URL地址,即当前页面是从哪个页面链接过来的,可以使用$_SERVER['HTTP_REFERER'],但是这个来源页面的URL地址是可以被伪造和欺骗的,本文章向大家介绍伪造HTTP_REFERER页面URL的三种方法,需要的朋友可以参考一下. $_SERVER['HTTP_REFERER']是php用来判断页面上级来源页面的一个超级变局变量了,我们可以使用$_SERVER['HTTP_REFERER']来判断是从哪个页面进入到此页面了,这样我们可以进行更好的跟踪了

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

    本文实例讲述了PHP伪造来源HTTP_REFERER的方法.分享给大家供大家参考.具体分析如下: 如今网络上十分流行论坛自动发帖机,自动顶贴机等,给众多论坛网站带来了大量的垃圾信息,许多网站只是简单地采用了判断HTTP_REFERER的值来进行过滤机器发帖,可是网页的HTTP_REFERER来路信息是可以被伪造的.任何事物都是双面刃,只要你善于利用就有其存在价值. 很早以前,下载软件如Flashget,迅雷等都可以伪造来路信息了,而这些软件的伪造HTTP_REFERER大多是基于底层的sock来

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

    HTTP-REFERER这个变量已经越来越不可靠了,完全就是可以伪造出来的东东. 以下是伪造方法: ASP: 复制代码 代码如下: dim http   set http=server.createobject("MSXML2.XMLHTTP") '//MSXML2.serverXMLHTTP也可以  Http.open "GET",url,false   Http.setRequestHeader "Referer","http://

随机推荐