隐藏来源 禁用Referrer 的方法

article/2023/10/1 2:33:34

原文链接:

https://www.cnblogs.com/duanweishi/p/16490197.html 

https://blog.csdn.net/qq996150938/article/details/111659131

 

论页面禁止 referer 的 6 种方式

1. head 标签中添加 meta属性

可以在 head 标签中添加 meta 属性,设置

1
name='referrer' content='never'

 

referer 的 metedata 参数可以设置为以下几种类型的值:

  • never
  • always
  • origin
  • default

如果在文档中插入 meta 标签,并且 name 属性的值为 referrer,浏览器客户端将按照如下步骤处理这个标签:

  1. 如果 meta 标签中没有 content 属性,则终止下面所有操作
  2. 将 content 的值复制给 referrer-policy ,并转换为小写
  3. 检查 content 的值是否为上面 list 中的一个,如果不是,则将值置为 default

接下来浏览器后续发起 http 请求的时候,会按照 content 的值,做出如下反应 (下面 referer-policy 的值即 meta 标签中 content 的值):

  1. 如果 referer-policy 的值为 never:删除 http head 中的 referer
  2. 如果 referer-policy 的值为 default:如果当前页面使用的是 https 协议,而正要加载的资源使用的是普通的 http 协议,则将 http header 中的 referer 置为空
  3. 如果 referer-policy 的值为 origin:只发送 origin 部分
  4. 如果 referer-policy 的值为 always:不改变http header 中的 referer 的值,注意:这种情况下,如果当前页面使用了 https 协议,而要加载的资源使用的是 http 协议,加载资源的请求头中也会携带 referer

例子

举个例子,如果你的页面是:

1
<meta name="referrer" content="never">

 

那么加载的第三方资源将不会带上 referer 头部:

png

而且可以看到请求的 Referrer Policy 变成 no-referrer

然后如果是换成:

1
<meta name="referrer" content="origin">

 

就换变成只带 host 域名, 跟 origin 头部几乎一样 (多了最外面一个斜杠)

png

然后对应请求的 Referrer Policy 变成 origin:

png

兼容性

这个标准还是比较老的,不过通过 can i use meta:referrer 还是可以看到大部分的主流浏览器 (Edge, Firefox, Chrome) 都有支持 (我亲测过了)

png

2. 添加ReferrerPolicy属性

添加 meta 标签相当于对文档中的所有链接都取消了 referer ,而 ReferrerPolicy 则更精确的指定了某一个资源的 referer 策略。关于这个策略的定义可以参照 MDN。比如我想只对某一个图片取消referrer,如下编写即可:

1
<img src="xxxx.jpg"  referrerPolicy="no-referrer" />

 

A 标签也支持这个属性:

1
<a href="xxxx.html"  referrerPolicy="no-referrer" />

 

兼容性

通过 can i use referrerPolicy, 可以看到除了 IE 和 少部分手机浏览器, 大部分的主流浏览器还是支持的:

png

3. 通过 rel=’noreferrer‘

还可以通过标签的 rel 属性来禁止 referer 头部:

1
<a href="xxxx.html"  rel="noreferrer" />

 

当然目前兼容的有限, 只支持 <a><area><form> 这三个元素:

The noreferrer keyword for the rel attribute of the <a><area>, and <form> elements instructs the browser, when navigating to the target resource, to omit the Referer header and otherwise leak no referrer information — and additionally to behave as if the noopener keyword were also specified.

mozilladeveloper.mozilla.org/en-US/docs/Web/HTML/Link_types/noreferrer

 

通过 can i use noreferrer 可以看到支持的浏览器版本:

png

4. 代理模式

这个就比较好理解了,把自己的服务器当做代理服务器, 请求先经过自己服务器, 修改referer头, 再反向代理到真正的服务器地址。

5. 外链 通过 iframe 来打开

如果是通过外链的话,那么可以通过 iframe 的方式来打开:

1
2
3
function open_without_referrer(link){
document.body.appendChild(document.createElement('iframe')).src = 'javascript:"<script>top.location.replace(\''+link+'\')<\/script>"';
}

 

这个其实就是通过 top.location.replace 方法替换当前的页面,从而丢失掉 referer 来源,这时候如果点击浏览器的回退按钮,就会发现已经回退不过去了。

6. 外链通过新窗口打开

如果是通过 window.open 打开的方式,也可以这样做:

1
2
3
function open_new_window(full_link){ 
window.open('javascript:window.name;', '<script>location.replace("'+full_link+'")<\/script>');
}

 

这个跟上面的 iframe 差不多,也是通过 location.replace 方法来更新新打开窗口的文档。从而丢失掉 referer 来源。

推荐一个第三方库 noreferrer.js

提供跨浏览器支持的更好的办法是使用一个第三方的库 noreferrer.js,它可以自动识别浏览器并选择最优方案。

不过这边需要注意一点的是, 对于某些几乎不支持的特性浏览器,比如 Opera,noreferrer.js 的解决方案是利用 google 的url中转。在国内的网络环境下,你懂的。。。 所以可以自己搭建一个跳转的页面,或者用其他站点的url跳转接口。

 

js实现。

1、借助一个新页面跳转到目标地址。

<html>
<head><meta charset="utf-8"><style type="text/css" media="screen">iframe{display: none;}</style>
<body onLoad="open_without_referrer()">
<script>
function open_without_referrer(){var link = encodeURI('{$url}');//url为跳转链接document.body.appendChild(document.createElement('iframe')).src='javascript:"<script>top.location.replace(\''+link+'\')<\/script>"';
}
</script>
</body>
</html>

  2,直接跳转到目标地址,在原窗口打开。

function openWithoutReferrer(url){document.body.appendChild(document.createElement('iframe')).src='javascript:"<script>top.location.replace(\''+url+'\')<\/script>"';
}

  3,直接跳转到目标地址,在新窗口打开。

function openWithoutReferrer(url){window.open('javascript:window.name;', '<script>location.replace("'+url+'")<\/script>');
}

  如果要避免各种原因出现的缓存导致错误,我们在跳转时候加入当前时间。

function openWithoutReferrer(url){var oDate = new Date();window.open('javascript:window.name', '<script>location.replace("'+url+'")<\/script>'+oDate.getTime());
}

  


http://www.ngui.cc/article/show-461981.html

相关文章

autocad 2023 (cad2023)

AutoCAD2023 软件的最新功能,包括行业特定的工具集、新的自动化以及跨设备和 Autodesk 产品的无缝连接。 Mac详情:AutoCAD 2023 for Mac(cad2023) win版详情:AutoCAD 2023(CAD设计软件)新增功能 标记导入和标记辅助 快速发送反馈并将其纳入您的设计。从打印的纸张或 PDF 中…

prometheus监控mariadb

创建数据库账号 create user mysql_exporter@localhost IDENTIFIED BY imnot007*; GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO mysql_exporter@localhost; 下载mysql_exporter wget https://github.com/prometheus/mysqld_exporter/releases/download/v0.14.0/mysql…

wox+Eerything:无管理员权限如何运行Everything

场景 公司电脑无管理员权限,无法自行安装软件,经申请安装上了everything(通过申请临时管理员域账号安装),但启动时提示需要管理员权限,让输入账号密码,否则无法运行。 原因 everything需要读取NTFS数据建立索引,需要一定的管理员权限。 everything安装时一般会有选项,…

第七讲 数据库

7.1数据库 7.1.1数据库定义 数据库是存放数据的电子仓库。以某种方式存储百万条,上亿条数据,供多个用户访问共享。 7.2数据库类型 7.2.1主流的关系型数据库 字段和值,属性和属性值存在一定关系。两张表之间通过字段建立连接。 字段:字段每一行称为一个“记录”,每一个记录…

CF1710B-Rain【堆】

正题 题目链接:https://www.luogu.com.cn/problem/CF1710B题目大意 一个数轴,每个位置上开始时都有一个\(a_x=0\),\(n\)次操作\(p_i,h_i\)对于所有位置\(a_x\)令其变为\(a_x+\max(h_i-abs(p_i-x),0)\)。 对于每个操作,求删除这个操作后能否使得最终所有的\(a_x\leq m\)。 \(…

修改ue4缓存位置

找到 $文件安装路径\UE_4.24\Engine\Config\BaseEngine.ini 文件 找到InstalledDerivedDataBackendGraph,找Path="%ENGINEVERSIONAGNOSTICUSERDIR%DerivedDataCache,修改为Path="%GAMEDIR%DerivedDataCache" 默认位置为 C:\Users\用户名\AppData\Local\Unreal…

达梦表关联理解测试(一)

一、 表关联理论理解 表关联查询在数据库的SQL语句中存在非常普遍,在常见的关系型数据库中,主要存在三种形式的表关联,分别是:嵌套循环连接、哈希连接、归并排序连接,在达梦数据库中,支持对于表的三种关联方式,主要表现形式是:NEST LOOP HASH JOIN MERGE JOIN其…

python 中输出指定长度的fasta 序列

001、(base) root@PC1:/home/test2# ls a.fasta test.py (base) root@PC1:/home/test2# cat a.fasta ## 测试fasta文件 >OR4F5_ENSG00000186092_ENST00000641515_61_1038_2618 CCCAGATCTCTTCAGTTTTTATGCCTCATTCTGTGAAAATTGCTGTAGTCTCTTCCAGTTATGAAGAAGGTAA…

Kafka 消费者组

Kafka 消费者组 Consumer Group 是kafka 当中比较有亮点的设计了。 1. 消费者组的特点:一个分区只可以被消费组中的一个消费者所消费。 一个消费组中的一个消费者可以消费多个分区,例如 C1 消费了 P0, P3。一个消费组中的不同消费者消费的分区一定不会重复,例如: C1 -> …

IO流

1、JAVA流式输入输出原理在Java程序中,对于数据的输入/输出操作以“流”(Stream)方式进行;J2SDK提供了各种各样的“流”类,用以获取不同种类的数据:程序中通过标准的方法输入或输出数据。 流是用来读写数据的,java有一个类叫File,它封装的是文件的文件名,只是内存里面…