1.什么是Referer

referer参数是http请求头header里的一个关键参数,表示的意思是链接的来源地址,比如在页面引入图片、JS 等资源,或者跳转链接,一般不修改策略,都会带上Referer

Referer安全性

Referer这个http header的参数应用得当的话,是可以提高安全性的,比如,可以这个参数其实就告诉了链接的请求来源于哪个网站,所以可以根据这个特性,限制一些接口只能本网站的才能调,外部网站不能调

案例:
比如你曾经在浏览器访问过银行A的网站,所以浏览器是有保存Cookie的,Cookie并没有过期,这时,你不小心登录一个恶意的论坛网站还是什么网站,你访问了链接(其实链接后面加的是窃取Cookie,调银行A网站转账API),这时候,如果网站安全性验证不过的话,就会窃取金钱的恶意操作
针对这个银行转账窃取案例,我们或许可以这样改造,我们可以再增加一个验证的工程,不给直接调用转账接口,我们在这个验证工程里加入Referer识别的。这时候,CSRF攻击的话,肯定得在非银行A官网的服务器发送请求,我们改造之后,这个请求会先发送到验证工程这里,这时候解析请求,获取Referer属性进行识别,发现不是银行A官网的地址,这时候直接拦截,拒绝访问。

这个案例是合理应用Referer的,当然Referer是记录来源地址,很显然,这个Referer的url里很可能也会带上一些敏感信息,比如token或者用户的信息等,这些一旦被其它网站窃取了,是很危险的,如果对于Referer参数要合理地使用,所以有必要介绍一下w3c提出的referrer policy

ps:http header里的referer其实是拼写少了一个r,正确的拼写应该是referrer ,不过当初http标准发出来时候,并没有发现拼写错了,所以现在一直保持着拼写错误

相关术语

  • 同源策略:同源策略指协议+域名+端口都相同的情况,是由Netscape提出的一个著名的安全策略,现在所有支持JavaScript 的浏览器都会使用这个策略。实际上,这种策略只是一个规范,并不是强制要求,各大厂商的浏览器只是针对同源策略的一种实现

  • 跨域请求:跨域请求就是不符合同源策略的情况,也就是协议、域名、端口有一个或多个不一样,都算是跨域的请求,所以https链接和http链接的相互调用也是属于跨域的请求

2.什么是Referrer-Policy

The Referrer-Policy HTTP header governs which referrer information, sent in the Refererheader, should be included with requests made.

通俗点就是Referrer的策略, Referrer 就是 referrer 属性可返回载入当前文档的文档的 URL

Syntax

Referrer-Policy: no-referrer
Referrer-Policy: no-referrer-when-downgrade
Referrer-Policy: origin
Referrer-Policy: origin-when-cross-origin
Referrer-Policy: same-origin
Referrer-Policy: strict-origin
Referrer-Policy: strict-origin-when-cross-origin
Referrer-Policy: unsafe-url

如果值无效就是默认值。


no-referrer
整个 Referer 首部会被移除。访问来源信息不随着请求一起发送

no-referrer-when-downgrade (默认值)
在没有指定任何策略的情况下用户代理的默认行为。在同等安全级别的情况下,引用页面的地址会被发送(HTTPS->HTTPS),但是在降级的情况下不会被发送 (HTTPS->HTTP)。
origin
在任何情况下,仅发送文件的源作为引用地址。例如 https://example.com/page.html 会将 Example Domain 作为引用地址。
origin-when-cross-origin
对于同源的请求,会发送完整的URL作为引用地址,但是对于非同源请求仅发送文件的源。
same-origin
对于同源的请求会发送引用地址,但是对于非同源请求则不发送引用地址信息
strict-origin
在同等安全级别的情况下,发送文件的源作为引用地址(HTTPS->HTTPS),但是在降级的情况下不会发送 (HTTPS->HTTP)。
strict-origin-when-cross-origin
对于同源的请求,会发送完整的URL作为引用地址;在同等安全级别的情况下,发送文件的源作为引用地址(HTTPS->HTTPS);在降级的情况下不发送此首部 (HTTPS->HTTP)。
unsafe-url
无论是同源请求还是非同源请求,都发送完整的 URL(移除参数信息之后)作为引用地址。(最不安全的策略了)

Referrer Policy Delivery

知道了有哪些策略可以用,还需要了解怎么用。这里介绍指定 Referrer Policy 的三种方式:

CSP 响应头

CSP(Content Security Policy),是一个跟页面内容安全有关的规范。在 HTTP 中通过响应头中的 Content-Security-Policy 字段来告诉浏览器当前页面要使用何种 CSP 策略。我之前写过一篇 Content Security Policy 介绍,可以先看看。现在 CSP 还可以通过 referrer 指令和五种可选的指令值,来指定 Referrer 策略,格式非常简单:

Content-Security-Policy: referrer no-referrer|no-referrer-when-downgrade|origin|origin-when-cross-origin|unsafe-url;

注:根据文档,通过 CSP 头部设置 Origin When Cross-origin 策略时,指令值应该用 origin-when-cross-origin,这跟前面的表格里的 origin-when-crossorigin 有差异。实际上经过我的测试,Chrome 42 只支持 origin-when-crossorigin,后续会不会变还不知道,建议大家使用时,自己先测一下。

CSP 的指令和指令值之间以空格分割,多个指令之间用英文分号分割。

<meta> 标签

通过 <meta> 标签也可以指定 Referrer 策略,同样很简单:

<meta name="referrer" content="no-referrer|no-referrer-when-downgrade|origin|origin-when-crossorigin|unsafe-url">

需要注意的是,<meta> 只能放在 <head>...</head> 之间,如果出现的位置不对会被忽略。同样,如果没有给它定义 content 属性,或者 content 属性为空,也会被忽略。如果 content 属性不是合法的取值,浏览器会自动选择 no-referrer 这种最严格的策略。

<a> 标签的 referrer 属性

通过给 <a> 标签增加 referrer 属性也可以指定 Referrer 策略,格式如下:

<a href="http://example.com" referrer="no-referrer|origin|unsafe-url">xxx</a>

这种方式作用的只是这一个链接。并且,<a> 标签可用的 Referrer 策略只有三种:不传、只传 host 和都传。另外,这样针对单个链接设置的策略优先级比 CSP 和 <meta> 要高。

需要注意的是:经过我的测试,目前并没有哪个浏览器实现了对 referrer 属性的支持。现阶段,如果要针对单个链接去掉 Referrer,还是推荐使用下面这种支持度更好的写法(详情):

<a href="http://example.com" rel="noreferrer">xxx</a>

另外再重复一遍,现阶段的浏览器还保留了对 never、default 和 always 的支持,但是已经不推荐使用了。

可以看到,通过新的 Referrer 策略,网站所有者可以选择更高的安全级别来保证用户隐私不被泄露;也可以选择更低的安全级别来获得一些便利,相比之前只能由浏览器默认策略一刀切,确实灵活了不少。

参考:

HTTP系列之Referer和Referrer policy简介 - smileNicky - 博客园

Referrer Policy 介绍 | JerryQu 的小站

Referrer和Referrer-Policy简介相关推荐

  1. Referrer和Referrer Policy介绍

    1. Referrer referrer是HTTP请求header的报文头,用于指明当前流量的来源参考页面.通过这个信息,我们可以知道访客是怎么来到当前页面的.这对于网站分析(Web Analytic ...

  2. HTTP系列之Referer和Referrer policy简介

    文章目录 1.前言摘要 2.Referer简介 3.Referer安全性 4.相关术语 5.Referrer Policy 5.1.no-referrer 5.2.no-referrer-when-d ...

  3. php referrer policy,HTTP的Referrer和Referrer Policy设置

    Refe作一新求抖直微圈rrer referrer是HTTP请求header的报文头,用于指明当前流量的来源参考页面.通过这个信息,我们可以知道访客是怎么来到当前页面的.这对于Web Analytic ...

  4. HTTP的Referrer和Referrer Policy介绍

    本文链接:https://blog.csdn.net/dujie1219/article/details/111273925 Referrer referrer是HTTP请求header的报文头,用于 ...

  5. Referer和Referrer Policy详解

    最近换了个负责网络安全的leader,整个部门开始网络安全整顿,我们负责WEB的接到通知要求防御CSRF攻击,设置referer白名单.之前看过一点referer相关的,但是了解不够深入,趁这次机会好 ...

  6. 百度统计提示referrer出错解决办法

    今天给我的网站 https://www.kevinguo.cn/ 添加 百度统计代码,在检查代码时出现错误,提示referrer出错. 如何解决? 1.统计代码放置位置 需要紧挨着</head& ...

  7. img标签访问图片403(http referrer),直接访问图片链接可以打开

    先说下解决方法: 在HTML代码的head中添加一句, <meta name="referrer" content="no-referrer" /> ...

  8. HTTP首部---referrer 知识点

    Referrer介绍 Referrer网站来路:访问者进入网站任何途径.HTTP Referer是header的一部分,当浏览器向web服务器发出请求的时候,一般会带上Referer,告诉服务器用户从 ...

  9. 前端解决第三方图片防盗链的办法 - html referrer 访问图片资源 403 问题

    问题 笔者网站的图片都是上传到第三方网站上的,比如 简书.掘金.七牛云上的,但是最近简书和掘金都开启了 防盗链,防止其他网站访问他们网站上的图片了,导致笔者的网站存在他们网站上的图片全挂了. 具体问题 ...

最新文章

  1. 《结对-结对编项目作业名称-开发环境搭建过程》
  2. python restful 框架_restful-dj
  3. NodeJS-queryString
  4. Stone Game
  5. 昂贵的聘礼 poj 1062 dijsk
  6. 【ICCV2019】完整论文列表
  7. 物联网已死,API 万岁!
  8. java获取达梦数据库_记一次对达梦数据库的优化过程
  9. Android报错之You need to use a Theme.AppCompat theme (or descendant) with this activity.
  10. exe软件如何更改标题?
  11. win10网络工作组看不到其他计算机,win10系统工作组不显示其他计算机的解决方法...
  12. no matching cipher found
  13. python用正则写银行系统_python使用正则表达式(Regular Expression)方法超详细
  14. MySQL 五.索引与算法
  15. AIR开发ios游戏总结
  16. 不同类型怎么选择服务器
  17. AssetMark背后,是华泰的野心?还是TAMP的崛起?| 亿欧解案例
  18. Verilog 1.0常用CD4000系列标准数字电路及其框图
  19. linux kickstart之中rootpw密码生成方法
  20. 小程序获取小程序码getWXACodeUnlimit 报错参数错误

热门文章

  1. sql_safe_updates
  2. Css3制作风琴动画效果
  3. Altium Designer输出生产文件Gerber、IPC、NC Drill、坐标文件--AD
  4. 基于Java+Swing+Mysql人口普查登记系统
  5. 最小变化法/极限法测定感觉阈限时,有哪些误差?包括时间和空间误差吗?|小白心理-312/347考研答疑
  6. In on deep learning
  7. springmvc+mybatis+shiro MD5加密匹配登录失败超次数锁定帐号
  8. 如何快速的成为一个合格的Oracle DBA?
  9. 如祺出行:广汽与腾讯的算盘
  10. java跨平台 ios_Smobiler如何实现.net一键开发,ios和android跨平台运行