发布于 署名 4.0 国际 (CC BY 4.0) 原文链接:https://caixw.io/posts/2017/referrer-policy.html

当用户在浏览器上点击一个链接时,会产生一个 HTTP 请求,用于获取新的页面内容,而在该请求的报头中,会包含一个 Referrer,用以指定该请求是从哪个页面跳转页来的,常被用于分析用户来源等信息。但是也有成为用户的一个不安全因素,比如有些网站直接将 sessionid 或是 token 放在地址栏里传递的,会原样不动地当作 Referrer 报头的内容传递给第三方网站。

所以就有了 Referrer Policy,用于过滤 Referrer 报头内容,目前是一个候选标准,不过已经有部分浏览器支持该标准。具体的可查看这里。

指令值

目前包含了以下几种指令值:

enum ReferrerPolicy {
"",
"no-referrer",
"no-referrer-when-downgrade",
"same-origin",
"origin",
"strict-origin",
"origin-when-cross-origin",
"strict-origin-when-cross-origin",
"unsafe-url"
};

空字符串

按照浏览器的默认值执行。默认值为 no-referrer-when-downgrade。部分标签可重定义此安全策略。

no-referrer

从字面意思就可以理解,不传递 Referrer 报头的值。

no-referrer-when-downgrade

当发生降级(比如从 https:// 跳转到 http:// )时,不传递 Referrer 报头。但是反过来的话不受影响。通常也会当作浏览器的默认安全策略。

原地址 跳转地址 Referrer
https://example.com?token=123 https://example.com/path https://example.com?token=123
http://example.com?token=123 http://example.com/path http://example.com?token=123
https//example.com http://example.com/path 无(协议降级)
http://example.com?token=123 https://example.com/path http://example.com?token=123

same-origin

同源,即当协议、域名和端口(如果有一方指定的话)都相同,才会传递 Referrer。

原地址 跳转地址 Referrer
https://example.com?token=123 https://example.com/path https://example.com?token=123
http://example.com?token=123 http://example.com/path http://example.com?token=123
https//example.com http://example.com/path 无(协议不同)
http://example.com?token=123 https://example.com/path 无(协议不同)
http://example.com?token=123 http://example.com:88/path 无(端口不同)
https://example.com?token=123 https://caixw.io 无(域名不同)

origin

将当前页面过滤掉参数及路径部分,仅将协议、域名和端口(如果有的话)当作 Referrer。

原地址 跳转地址 Referrer
https://example.com?token=123 https://example.com/path https://example.com
http://example.com?token=123 https://example.com/path http://example.com
https://example.com?token=123 https://caixw.io https://example.com

strict-origin

类似于 origin,但是不能降级。

原地址 跳转地址 Referrer
https://example.com?token=123 https://example.com/path https://example.com
http://example.com?token=123 https://example.com/path http://example.com
http://example.com?token=123 http://caixw.io http://example.com
https://example.com?token=123 http://caixw.io 无

origin-when-cross-origin

跨域时(协议、域名和端口只有一个不同)和 origin 模式相同,否则 Referrer 还是传递当前页的全路径。

原地址 跳转地址 Referrer
https://example.com?token=123 https://example.com/path https://example.com?token=123
http://example.com?token=123 https://example.com/path http://example.com?token=123
http://example.com?token=123 http://caixw.io http://example.com

strict-origin-when-cross-origin

与 origin-when-cross-origin 类似,但不能降级。

原地址 跳转地址 Referrer
https://example.com?token=123 https://example.com/path https://example.com?token=123
https://example.com?token=123 https://caixw.io https://example.com
https://example.com?token=123 http://example.com/path 无
https://example.com?token=123 http://example.com/ 无

unsafe-url

任意情况下,都发送当前页的全部地址到 Referrer,最宽松和不安全的策略。

传递方式

Referrer-Policy 报头

推荐的方式,直接在 Referrer-Policy 报头中设置。

Referrer-Policy: origin;

Meta

通过指定 name 值为 referrer 的 meta 标签,也可以达到相同的效果:

<meta name="referrer" content="strict-origin" />

content 可以是上面的指定的值,也可以是下面这几种旧的指令值,会自动作相应的转换,但不推荐这些旧的指令值:

Legacy Referrer
never no-referrer
default no-referrer-when-downgrade
always unsafe-url
origin-when-crossorigin origin-when-cross-origin

标签属性

  • a 和 link 标签可以通过属性 rel 指定 noreferrer,仅对当前链接有效;
  • a、area、link、iframe 和 img 还可以通过 referrerpolicy 指定仅针对当前链接的设置。

参考

Referrer Policy

Referrer-Policy

浏览器的同源策略

Referrer Policy 介绍的更多相关文章

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

    目录 @ 1.前言摘要 在csdn网站随便抓个链接来看看: Referer参数: referrer policy是unsafe url的,ok,下面介绍一下Referer和referrer polic ...

  2. referrer policy

    我们知道,在页面引入图片.JS 等资源,或者从一个页面跳到另一个页面,都会产生新的 HTTP 请求,浏览器一般都会给这些请求头加上表示来源的 Referrer 字段.Referrer 在分析用户来源时 ...

  3. HTTP的Referrer和Referrer Policy设置

    Referrer referrer是HTTP请求header的报文头,用于指明当前流量的来源参考页面.通过这个信息,我们可以知道访客是怎么来到当前页面的.这对于Web Analytics非常重要,可以 ...

  4. HTTP Referrer和Referrer Policy 设置

    referrer是HTTP请求header的报文头,用于指明当前流量的来源参考页面.通过这个信息,我们可以知道访客是怎么来到当前页面的.这对于Web Analytics非常重要,可以用于分析不同渠道流 ...

  5. 请求出现Referrer Policy: no-referrer-when-downgrade

    请求出现Referrer Policy: no-referrer-when-downgrade,一直请求不成功,原因是请求连接出现问题,我这里的问题是api前少了/,导致字段和域名拼接起来,所以请求U ...

  6. Content Security Policy介绍

    Content Security Policy https://content-security-policy.com/ The new Content-Security-Policy HTTP re ...

  7. 关于启用 HTTPS 的一些经验分享

    https://imququ.com/post/sth-about-switch-to-https.html 随着国内网络环境的持续恶化,各种篡改和劫持层出不穷,越来越多的网站选择了全站 HTTPS. ...

  8. JavaWeb_响应和请求数据包

    Google浏览器 F12中Network->Header部分 <%@ page language="java" import="java.util.*&qu ...

  9. img引用网络图片资源无法加载问题解决

    近期在自己项目中遇到引用一些网络图片资源,显示无法加载,但是在浏览器打开图片路径又可以显示的问题 解决办法: 在图片显示的界面把meta referrer标签改为never <meta name ...

随机推荐

  1. 学python之路前的一些话

    为什么学python: 这些年一直从事运维相关的工作.但做下来感觉都是些很基础的东西,无非就是对一些命令或者问题处理很熟练而已,混的都是经验.曾很羡慕会写shell脚本,会自动化安装程序的运维组组长, ...

  2. ajax实现

    AJAX是为了实现异步通信,提高用户体验度.JavaScript本身并不具有向服务器发送请求的功能(不使用NodeJs),要么使用window.open()方法重新打开一个页面向服务器发送请求,要么使 ...

  3. C++指针二(易错模型)

    规则一:Main(主调函数)分配的内存(在堆区,栈区.全局区)都可以在被调用函数里使用.如果在被调用函数里面的临时区(栈)分配内存,主调用函数是不能使用的. #include "stdio. ...

  4. SPFA_queue_链式前向星最短路 & HDU2433

    题目大意:看完之后,觉得不肯能让我暴力,比较好想的就是初始化——每个点都求个最短路spfa,sum数组记录每个点到各个点的最短路之和,ans作为总和,之后一一删除边u-v,求关于u的最短路,如果dis ...

  5. DXP中插入LOGO图片方法(1)

    DXP中插入LOGO图片方法 1.QQ截图后,打开“开始”-->"附件"——>"画图工具",如图: 2.另存为BMP文件格式(设置图片大小.黑白色即 ...

  6. 有关VS报错Files的值XXX

    从网上下载了一个实例来学习,但是运行的时候报错:Files的值(后面跟一堆符号,看不懂), 环境:安装了易赛通加密软件(估计可能跟这个加密软件有关系了) 解决方案:找到程序根目录的obj/Debug/ ...

  7. Windows8.1 安装SQL Server2012——部分组件安装不成功!(提示安装.NET 3.5时出错,无Internet情况下利用win8.1安装镜像安装.NET 3.5)

    虽然从事着与开发毫无关系的工作,但却也断断续续维持了近6年的WEB开发,有时因为其它工作原因,可能每做一个项目的时间间隔比较大,有时甚至在做的一个项目因为其他事情而停滞几个月之久(有些项目是自己兴趣或 ...

  8. WinForm POST上传与后台接收

    前端 using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using ...

  9. 【BZOJ2328】 [HNOI2011]赛车游戏

    BZOJ2328 [HNOI2011]赛车游戏 前言 这道题目我真的佛了,卡精度+卡时间这就是下一个聊天鬼才. Solution 首先可以二分出最大速度,然后考虑下坡的话可能有更好的解,然后这样子算一 ...

  10. Flask系列06--(中间件)Flask的特殊装饰器 before_request,after_request, errorhandler

    一.使用 Flask中的特殊装饰器(中间件)方法常用的有三个 @app.before_request # 在请求进入视图函数之前 @app.after_request # 在请求结束视图函数之后 响应 ...