最近换了个负责网络安全的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. 你想要的宏基因组-微生物组知识全在这(190101)
  2. PowerShell入门
  3. 网站自动提交至百度站长收录平台函数(适用任何框架代码)
  4. linux中oracle数据乱码,Linux系统Oracle数据库乱码问题的解决方法
  5. python print 换行_Python学习 | Python的基础语法
  6. 2021年河北省高考成绩录取查询结果,2021年河北高考一本录取结果查询和录取通知书发放时间...
  7. Python Flask Web 第一课 —— 基本概念和程序的基本结构
  8. 《MySQL必知必会》学习笔记——第八章(用通配符过滤)
  9. 懒牛人脉管家 v4.4.5
  10. 快来试试用 Python 将你的照片转化为“速写”
  11. 女生找工作,非常有用,好好 收藏,以后肯定能用得上 (转)
  12. pycharm查找替换快捷键
  13. Mqtt ----心跳机制 长链接 ping
  14. protractor测试框架6----报告、公共方法、公共变量
  15. 解决:navicat连接mysql报错10060
  16. Come Clear - Hilary Duff(希拉瑞.达芙)
  17. Java设计模式-单一职责原则
  18. es6中Generator函数的理解
  19. Ipad 横屏、分屏页面布局错乱问题
  20. break在python中什么意思_Python中break 关键字用途说明

热门文章

  1. 马尾综合征的病因都有哪些?
  2. 哔哩哔哩“红杏出墙”
  3. 电子设计教程36:LC并联谐振滤波器
  4. 高等数学(第七版)同济大学 习题9-7 个人解答
  5. 自动整理文件夹(Droplt使用教程)
  6. 【Python】网页爬取CVPR论文
  7. gazebo加载world模型
  8. 升级UI设计作品集特色的4个小技巧
  9. USB硬件 键盘鼠标控制器 Lao-UKM V3.1 (增加高级客户功能)
  10. 云模型在综合评价过程中的应用