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

1. 什么是 Referer

Referer 是 HTTP 请求头的一个字段,当浏览器(或者模拟浏览器行为)向服务器发送请求时,浏览器会自动在请求头中加上 Referer 字段,表示的意思是链接的来源地址,比如在页面引入图片、JS 等资源,或者跳转链接,一般不修改策略,都会带上Referer。

比如在www.google.com 里有一个www.baidu.com 链接,那么点击这个www.baidu.com ,它的header 信息里就有:Referer=http://www.google.com


这里有个问题要说明下,Referer 实际上是单词 referrer 的错误拼写,Referrer-Policy 这个首部并没有延续这个错误拼写。

2. Referer 安全性

Referer 参数其实就告诉了链接的请求来源于哪个网站,所以可以根据这个特性,限制一些接口只能本网站的才能调,外部网站不能调。

这个参数常常是跟同源策略跨域请求关联在一起,因为现在普遍都是前后端分离项目, 前端页面的地址和后端 api 接口地址是跨域的,为了让后台接口判断是不是合法请求,除了前端在请求头中加上 Authorization 字段,后台也可以通过 Referer 字段判断请求来源。

另外,在 CSRF 攻击的防范中,除了 SameSite Cookie ,CSRF token 等方法,Referer 字段判断请求来源也是一种防范手段。

3. 什么是 Referrer-policy

Referrer Policy是W3C官方提出的一个候选策略,主要用来规范Referrer,简单来说就是规定什么时候发送 Referer 字段,以及发送哪些信息。

最初是只有5种策略的,现在规范增加到9种:

no-referrer
整个 Referer 首部会被移除,Referer 不随着请求一起发送。

no-referrer-when-downgrade (默认值)
在没有指定任何策略的情况下用户代理的默认行为。在同等安全级别(HTTPS -> HTTPS)的情况下,Referer 会被发送,在协议降级(HTTPS -> HTTP)的情况下 Referer 不会被发送。

origin
Referrer 发送的信息只包括协议+域名+端口,不包括其它信息。例如 https://example.com/page.html 会将 https://example.com/ 作为引用地址。

origin-when-cross-origin
对于同源的请求,会发送完整的URL作为引用地址,但是跨域时候只发送协议+域名+端口。

same-origin
同源请求发送,否则不发送。

strict-origin
在同等安全级别(HTTPS -> HTTPS)的情况下,发送Referrer(协议+域名+端口),但是在协议降级(HTTPS -> HTTP)的情况下不会发送。

strict-origin-when-cross-origin
对于同源的请求,会发送完整的URL作为引用地址;对于跨域请求,在同等安全级别(HTTPS -> HTTPS)的情况下,发送Referrer(协议+域名+端口);在协议降级(HTTPS -> HTTP)的情况下不发送此首部。

unsafe-url
无论协议是否降级,也不管是同源请求还是跨域请求,都发送完整的 URL(移除参数信息之后)作为引用地址,所以这种是一种不安全的协议。

这项设置会将受 TLS 安全协议保护的资源的源和路径信息泄露给非安全的源服务器。进行此项设置的时候要慎重考虑。—— Referrer-Policy,MDN文档

空字符串
相当于没有设置,在没有此类更高级别策略的情况下,默认使用 no-referrer-when-downgrade

4. Referrer-policy 使用方法

加在 Header 中

代码如下:

<script>
fetch(url, {referrerPolicy: "strict-origin-when-cross-origin"});
</script>

有一个疑问,在浏览器调试工具中,Referrer Policy 出现在 General 里面,并没有出现在请求或者响应的报文中,所以无法判断是在请求头还是响应头中。

MDN文档上说 Referrer Policy 是响应头中的字段,但我个人觉得如果是在响应头里面,请求都发出了,再响应这个字段也没啥用了。而如果是放在请求头里面,这个字段的作用是修改浏览器处理 Referer 的行为,提交给服务器也没啥用啊。

于是用Wireshark抓包工具看了一下报文信息,发现请求的时候只有 Referer ,没有 Referrer Policy ,说明这个字段并没有在实际请求的时候发送,也没有通过服务器响应接收:

所以 Referrer Policy 应该可以理解为浏览器自己的一个配置项,在构造 ajax 请求的时候可以添加到 header 中,这个配置项用于修改浏览器处理 Referer 的行为,但不会放到实际的 header 中发送给服务端。

页面设置
现在很多前端项目都是单页应用,可以在入口文件 index.html 中的 <head> 标签中添加 meta 信息:

<meta name="referrer" content="strict-origin-when-cross-origin">

元素设置
在html元素中设置 referrerpolicy

<a href="http://example.html" referrerpolicy="origin" target="_blank">链接</a>
<img src="/example.jpg" referrerpolicy="strict-origin-when-cross-origin" />

Referrer-Policy是有一个优先级顺序的:

  • Element-level policy

  • Page-level policy

  • Browser default

元素级别的策略优先级最高,页面级别的次之,浏览器默认值最低。所以,可以先设置一个较严格的页面级策略,再对某些资源做渐进增强。

5. Referer 应用场景

  1. 防盗链
  2. 防止恶意请求

参考:
Referrer-Policy MDN 官方文档
HTTP系列之Referer和Referrer policy简介
http请求头中Referer的含义和作用
HTTP的Referrer和Referrer Policy设置

Referer和Referrer Policy详解相关推荐

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

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

  2. 【JavaWeb开发】Referer防盗链的详解

    1. 什么是Referer? Referer 是 HTTP 请求(requset) header 的一部分,当浏览器(或者模拟浏览器行为)向web 服务器发送请求的时候,头信息里就有包含 Refere ...

  3. css 添加 referer,http中Referer和Referrer Policy

    一. referer是什么referer:引用页.HTTP请求头信息中,referer用于提供访问来源的信息,客户端发送请求的时候,自主决定是否加上该字段.服务器一般使用referer识别访问来源,可 ...

  4. HTTP请求中的Referer和Referrer Policy

    Referer Referer请求头包含了当前请求页面的来源页面的地址,即表示当前页面是通过此来源页面里的链接进入的.服务端一般使用Referer(注:正确英语拼写应该是referrer,由于早期HT ...

  5. Proximal Policy Optimization (PPO)详解

    文章目录 On-policy v.s. Off-policy 将On-policy变为Off-policy PPO算法/TRPO算法 PPO2 总结 On-policy v.s. Off-policy ...

  6. 【强化学习】DDPG(Deep Deterministic Policy Gradient)算法详解

    http://www0.cs.ucl.ac.uk/staff/d.silver/web/Teaching.html 引用莫凡老师的素材 https://morvanzhou.github.io/tut ...

  7. 【强化学习】Policy Gradient算法详解

    DeepMind公开课https://sites.google.com/view/deep-rl-bootcamp/lectures David Silver教程 http://www0.cs.ucl ...

  8. 强化学习PPO从理论到代码详解(1)--- 策略梯度Policy gradient

    第0章 闲聊吹水 Proximal Policy Optimization(PPO) 近端策略优化,可以说是目前最稳定,最强的强化学习算法之一了,也是openAI默认的强化学习算法,有多叼不用我说了吧 ...

  9. Policy gradient(策略梯度详解)

    文章目录 策略梯度基本知识 什么是策略梯度? 强化学习案例 策略梯度公式详解 如何使你的损失函数更好 增加一个基准 为每一个action分配不同的权重 策略梯度基本知识 什么是策略梯度? 直接根据状态 ...

最新文章

  1. 【APP接口开发】chrome浏览器DHC工具安装使用(亲测有效)
  2. GitHub 发布了一款重量级产品,可直接运行代码!
  3. case when then else 详解
  4. 新疆农业大学计算机科学与技术专业怎么样,新疆农业大学计算机科学与技术专业2016年在新疆理科高考录取最低分数线...
  5. java线程提高速度_如何在JAVA中减慢线程速度
  6. QT学习笔记(二):QT MinGW 和 MSVC 编译方式
  7. 缓存层设计套路(一)
  8. python爬虫模块_python之爬虫_模块
  9. Zcash已发布ZIP 313提案
  10. ARP攻击原理简析及防御措施
  11. Javascript 笔记与总结(1-3)arguments
  12. AJAX做一个动态进度条
  13. 部署django应用
  14. python调用matlab
  15. 深入理解Nginx 阅读笔记(一)
  16. 50个app帮你手机大换血!
  17. 如何批量查询身份证号码地址归属地,身份证性别男女,星座,身份证生肖,身份证年龄以及身份证是否校验合法,一篇文章介绍清楚
  18. 80端口被封 php跳转,80端口打不开网站问题
  19. 如何用计算机打出平方,如何用电脑打出平方?平方米符号输入方法介绍
  20. EXCEL表格-按条件求和、求平均值、求个数详解

热门文章

  1. 秒杀和抢单系统的设计思路
  2. 史上最厉害的“1+2”!这个270年前出现的大难题,已经60多年没有出现好消息了..........
  3. php7 unset函数,深入理解 PHP7 unset 真的会释放内存吗?
  4. 极术公开课|基于安谋科技STAR-MC1处理器的上海航芯ACM32芯片及方案介绍
  5. CAD创建和组织数据库
  6. 联通预计净利润下滑的背后
  7. Xcode13 The Legacy Build System will be removed in a future release.
  8. 学生就业管理系统后台模板
  9. .net 压缩、解压文件
  10. 两极相通——浅析最大—最小定理在信息学竞赛中的应用