Referrer和Referrer-Policy简介

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 的小站

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: referrer策略:no-referrer-when-downgrade 这是一种referrer策略,意思是当从HTTPS页面跳转到HTTP页面时,不会发送referrer信息。但是,当从HTTP页面跳转到HTTPS页面时,会发送referrer信息。这种策略可以保护用户的隐私,因为referrer信息可能包含敏感信息。 ### 回答2: referrer policy: no-referrer-when-downgrade是一个用于控制浏览器发送Referer信息的机制。Referer信息是一个HTTP头部参数,它包含了浏览器在向服务器发送请求时所在页面的URL,用于告诉服务器请求是从哪个页面发起的。 当浏览器从一个HTTPS安全网站(例如https://www.example.com)跳转到一个不安全的HTTP网站(例如http://target.example.com)时,浏览器会默认不发送Referer信息,以保护用户数据的安全性。这就是所谓的“downgrade”。 在referrer policy: no-referrer-when-downgrade模式下,当用户浏览器从HTTPS网站跳转到HTTP网站时,只有不带路径的域名信息会被发送到服务器,路径信息会被隐藏。这种方式既保护了用户的隐私信息,又能解决跨站点攻击问题。 referrer policy: no-referrer-when-downgrade适用于HTTPHTTPS之间的跳转,同时还支持同域名内的HTTPS和HTTP之间的跳转。如果你想要更强的安全性,可以使用referrer policy: strict-origin-when-cross-origin模式或referrer policy: same-origin模式,但这可能会影响一些站点的正常使用。 总之,referrer policy: no-referrer-when-downgrade是一种更安全的浏览器机制,能有效保护用户数据的安全,在网络安全中起到至关重要的作用。 ### 回答3: referrer policy: no-referrer-when-downgrade是一种Web安全策略,用于限制浏览器发送的HTTP referrer信息。HTTP referrer是浏览器在访问一个页面时会自动发送的HTTP头部信息,它包括用户的来源网址,即用户是从哪个网址链接进入当前网页的。这个信息对于网站开发人员和广告商来说非常重要,可用于提供有用的交互信息和追踪用户来源。但是,这个信息也可能被黑客利用,从而进行跟踪攻击或窃取敏感信息。 referrer policy: no-referrer-when-downgrade是一个比较严格的策略,它表示浏览器仅在当前页面从HTTPS转到HTTP时才会省略referrer信息,以保障用户隐私。也就是说,在从一个HTTPS链接进入另一个HTTPS链接的情况下,referrer信息将被发送,而在从HTTPS链接进入一个HTTP链接的情况下,referrer信息将被省略。 相比于最宽松referrer policy: no-referrer,no-referrer-when-downgrade提供了更好的安全保障,同时保留了一定程度的referrer信息可用性,使开发人员仍然可以使用referrer信息来跟踪用户并提供更好的用户体验。但是,有些情况下,这个策略可能会对某些网站功能造成影响,例如某些跨域请求需要referrer信息才能正常工作,而未收到referrer信息可能会影响网站部分功能的使用。因此,在使用这个策略时,开发人员需要根据具体情况权衡利弊,并做好测试和调试工作,以确保网站正常运行和用户隐私得到保护。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值