当前位置:网站首页>Referrer和Referrer-Policy简介
Referrer和Referrer-Policy简介
2022-07-07 18:22:00 【zzhongcy】
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 策略,网站所有者可以选择更高的安全级别来保证用户隐私不被泄露;也可以选择更低的安全级别来获得一些便利,相比之前只能由浏览器默认策略一刀切,确实灵活了不少。
参考:
边栏推荐
- Get webkitformboundary post login
- MIT science and technology review article: AgI hype around Gato and other models may make people ignore the really important issues
- 微服务远程Debug,Nocalhost + Rainbond微服务开发第二弹
- 搞定带WebKitFormBoundary post登录
- 如何满足医疗设备对安全性和保密性的双重需求?
- Deep learning model compression and acceleration technology (VII): mixed mode
- Spark 判断DF为空
- ASP.NET学习& asp‘s one word
- 浅尝不辄止系列之试试腾讯云的TUIRoom(晚上有约,未完待续...)
- How to test CIS chip?
猜你喜欢
[philosophy and practice] the way of program design
Splicing and splitting of integer ints
Cantata9.0 | 全 新 功 能
Nebula Importer 数据导入实践
With st7008, the Bluetooth test is completely grasped
Force buckle 2319 Judge whether the matrix is an X matrix
如何满足医疗设备对安全性和保密性的双重需求?
How to test CIS chip?
CodeSonar通过创新型静态分析增强软件可靠性
AADL Inspector 故障树安全分析模块
随机推荐
[award publicity] issue 22 publicity of the award list in June 2022: Community star selection | Newcomer Award | blog synchronization | recommendation Award
使用camunda做工作流设计,驳回操作
取两个集合的交集
网络原理(1)——基础原理概述
Micro service remote debug, nocalhost + rainbow micro service development second bullet
Precautions for cjson memory leakage
数据孤岛是企业数字化转型遇到的第一道险关
JNI 初级接触
想杀死某个端口进程,但在服务列表中却找不到,可以之间通过命令行找到这个进程并杀死该进程,减少重启电脑和找到问题根源。
凌云出海记 | 易点天下&华为云:推动中国电商企业品牌全球化
You want to kill a port process, but you can't find it in the service list. You can find this process and kill it through the command line to reduce restarting the computer and find the root cause of
Is it safe to open a stock account at present? Can I open an account online directly.
OneSpin | 解决IC设计中的硬件木马和安全信任问题
c语言如何判定是32位系统还是64位系统
一. 基础概念
Oracle 存儲過程之遍曆
H3C S7000/S7500E/10500系列堆叠后BFD检测配置方法
第二十章 使用工作队列管理器(三)
Airiot helps the urban pipe gallery project, and smart IOT guards the lifeline of the city
VMWare中虚拟机网络配置