最近在通过singlefile插件开发网站镜像关联功能时遇见一些问题进行记录。
问题
直接通过file协议打开本地镜像文件时,iframe中资源及链接无法通过file协议请求(链接跳转,及视频资源加载等)
由于上面那个原因,就需要在本地起一个服务来进行链接和资源的加载了,这样就解决上面的那个问题了。以前写过一个hmserve
命令行工具,可以在本地启动服务预览本地资源。以前没有增加cors跨域设置,所以就出现下面这种情况,所以现在加上Access-Control-Allow-Origin
头部即可。
当时hmserve
没设置cors头部时,点击链接跳转时,如果不设置target: _top
,iframe中的连接依旧被阻止加载。就是因为origin 为null,因为iframe开启沙盒或者iframe为base64直接渲染。
思考
针对上面的两个问题有了一些知识的学习和思考。
- 为什么file协议访问时,会有这些限制
- 为什么origin会为null,出现这个null我还以为是referer的原因,所以需要了解下
referrer-policy
- 链接跳转有哪些不知道的秘密(target)
- ...
解惑
为什么file协议访问时,会有这些限制
浏览器默认禁止网页通过 file://
协议直接访问本地文件系统,这是为了防止恶意网站窃取用户本地文件或执行未经授权的操作。
为什么 Origin
会变成 null
?
- 请求从一个本地文件(如通过
file://
协议打开的 HTML 页面)发起。浏览器认为file://
协议没有明确的域名、协议或端口(三者构成“源”)。 - 沙盒化的
<iframe>
或页面,页面被嵌入到设置了sandbox
属性的<iframe>
中,且未启用allow-same-origin
。沙盒化的<iframe>
会被浏览器限制权限。
我们遇见的请求就是iframe中设置了sandbox
,所以链接时origin就是null。
- 通过
base64 url
直接直接渲染的iframe和页面,data:
协议没有关联的源(如域名或端口)。
-
浏览器隐私或安全模式,部分隐私设置会限制来源信息的传递。
-
重定向或跨协议请求, 若重定向后的请求来源无法被浏览器归类为有效源(如跨协议)
-
跨源请求的安全策略限制, 服务器或浏览器启用了严格的跨域安全策略(如
Cross-Origin-Embedder-Policy: require-corp
)。某些安全策略会强制要求请求携带明确的Origin
,否则将其视为null
。
referrer-policy
Referer
是浏览器自动添加的请求头,表示当前页面的 URL(即跳转前的页面)。一般用于连接跳转时携带跳转前站点的origin,path等信息。
Origin
是浏览器专门用于 CORS 检查的请求头,表示请求发起的来源(协议 + 域名 + 端口)。
referrer-policy是用来指定referer字段中包含哪些原站点信息。
-
no-referrer
整个Referer
首部会被移除。访问来源信息不随着请求一起发送。 -
no-referrer-when-downgrade
在同等安全级别或安全级别提升的情况下(HTTP→HTTP、HTTP→HTTPS、HTTPS→HTTPS),在Referer
中发送Origin
、路径和查询字符串。而在目标的安全级别下降的情况下(HTTPS→HTTP、HTTPS→file)则不发送Referer
标头。 -
origin
仅在Referer
标头中发送Origin
。例如https://example.com/page.html
文档会将https://example.com/
作为Referer
。 -
origin-when-cross-origin
对于同源的请求,会发送完整的 URL 作为Referer
,但是对于非同源请求仅发送Origin
。 -
same-origin
对于同源的请求会发送Origin
、路径和查询字符串 作为Referer
,但是对于非同源请求则不发送Referer
信息。 -
strict-origin
在同等安全级别的情况下,发送文件的Origin
作为Referer
(HTTPS->HTTPS),但是在降级的情况下不会发送 (HTTPS->HTTP)。 -
strict-origin-when-cross-origin
(默认值) 对于同源的请求,发送Origin
、路径以及查询字符串 。对于在相同安全级别的情况下(HTTPS→HTTPS)的跨源请求,仅发送Origin
。在目标的安全级别下降的情况下(HTTPS→HTTP)则不发送Referer
标头。 -
unsafe-url
无论是同源请求还是非同源请求,都发送完整的 URL(移除参数信息之后)作为Referer
。
链接跳转有哪些不知道的秘密(target)
我们就参考target mdn
来了解下target
。
该属性指定在何处显示链接的 URL。
_self
:当前页面(文档)加载。(默认)_blank
:通常在新标签页打开,但用户可以通过配置选择在新窗口打开。_parent
:当前浏览环境的父级浏览上下文。如果没有父级框架(当前所处的文档的父文档),行为与_self
相同。_top
:最顶级的浏览上下文(当前浏览上下文中最“高”的祖先)。如果没有祖先,行为与_self
相同。
当使用 target="_blank"
时,存在一定的安全风险,因为新打开的页面可以通过 window.opener
访问原页面的一些信息。为了避免这种风险,可以同时添加 rel="noopener noreferrer"
属性:
<a href="https://www.baidu.com" target="_blank" rel="noopener noreferrer">在新窗口打开 </a>
往期年度总结
- 在上海的忙碌一年,依旧充满憧憬(2024)
- 四年沿海城市,刚毕业,一年3家公司
- 七月仿佛又回到了那一年(2023年中总结)
- 一位初入职场前端仔的年度终结 <回顾2022,展望2023>
- 大学两年半的前端学习
往期文章
- 啊,原来sessionStorage是这样的
- 如何像掘金编辑器一样粘贴图片即可上传服务器
- Nest装饰器全解析
- Nest世界中的AOP
- Nestjs如何解析http传输的数据
- 如何理解js的DOM事件系统
- 半年没看vue官网,3.5刚刚发布,趁机整理下
- 啊,你还在找一款强大的表格组件吗?
- 前端大量数据层级展示及搜索定位预览
- 如何从0开始认识m3u8(提取,解析及下载)
- 展示大量数据节点(tree),引发的一次性能排查
- ts装饰器的那点东西
- 这是你所知道的ts类型断言和类型守卫吗?
- TypeScript官网内容解读
- 经常使用ts的你,知道这些内容?
- 你有了解过原生css的scope?
- 现在比较常用的移动端调试你知道哪些?
- 众多跨标签页通信方式,你知道哪些?(二)
- 众多跨标签页通信方式,你知道哪些?
- 反调试吗?如何监听devtools的打开与关闭
- 因为原生,选择一家公司(前端如何防笔试作弊)
- 结合开发,带你熟悉package.json与tsconfig.json配置
- 如何优雅的在项目中使用echarts
- 如何优雅的做项目国际化
- 近三个月的排错,原来的憧憬消失喽
- 带你从0开始了解vue3核心(运行时)
- 带你从0开始了解vue3核心(computed, watch)
- 带你从0开始了解vue3核心(响应式)
- 3w+字的后台管理通用功能解决方案送给你
- 入职之前,狂补技术,4w字的前端技术解决方案送给你(vue3 + vite )
专栏文章
🔥如果此文对你有帮助的话,欢迎💗关注、👍点赞、⭐收藏、✍️评论, 支持一下博主~
公众号:全栈追逐者,不定期的更新内容,关注不错过哦!