📖
blog
  • README
  • JavaScript
    • 元素的宽高位置信息梳理
    • dom-align 源码浅析
    • Event Loop
    • 函数实参为对象时的陷阱
    • export 与 utils 方法书写规范
    • 手写 Promise 及相关代码理解
    • call,apply,bind 等函数的模拟实现
    • JavaScript继承
    • JavaScript 数据类型与类型判断
    • for..of 和 for..in 的区别
    • 写给自己看的 next 函数
    • JS 可选链与双问号
    • mouseenter 与 mouseover 事件的区别
    • Immutable相关知识
  • CSS
    • 不简单的 z-index
    • 两列布局,三列布局
    • CSS 居中方案整理
    • CSS 像素,设备像素,2倍图梳理
    • iconfont 的使用
  • Node JS
    • 实现简易的 express
  • React 核心知识点整理
    • 高阶组件
    • React 事件处理
    • React Hooks
    • React Context
  • React 状态管理
    • Redux 基础概念
    • Redux 中间件和异步操作
    • Redux Saga
    • Redux 只能有一个 store 对象嘛
  • React 开发实践
    • Ant Design Menu 组件的使用与深入
    • 讲讲吸顶效果与 react sticky
    • 基于 express,搭建 react 的开发环境
    • 通过 antd input 组件分析受控与非受控组件
    • DebounceClick 组件
    • react component Align 组件分析
    • React Portal 之事件冒泡
    • React Transition Group 源码浅析
    • React.cloneElement 父组件向子组件注入 props
    • 一次 Align 组件的问题记录
    • 如何知道子组件的类型
    • React Router 源码简单分析
    • React Redux 源码简单分析
  • Vue.js
    • Vue.js 概览
    • scoped 样式中的 deep
  • TypeScript 语法
    • 基础类型
    • 变量声明
    • 接口
    • 类
    • 函数
    • 泛型
    • 枚举
    • 类型推论
    • 类型兼容性
    • 高级类型
    • Symbol
    • 迭代器和生成器
    • 模块
    • 命名空间
    • JSX
  • 玩转 webpack
    • 第一章: webpack 与构建发展简史
    • 第二章:webpack基础用法
    • 第三章:webpack进阶用法
    • 第四章:编写可维护的 webpack 构建配置
    • 第五章:webpack构建速度和体积优化策略
    • 第六章:通过源代码掌握webpack打包原理
    • 第七章:编写Loader和插件
  • webpack 实践
    • 如何配置 output.library
  • 测试
    • 初识代码测试
    • Jest 中 如何测试 setTimeout
    • Jest Enzyme React 测试实践记录
  • WEB 开发,过往工作沉淀
    • Web安全(DVWA)
    • 内存泄露与事件移除的必要性
    • url to pdf api 与 服务部署踩坑记录
    • 前端调试指南
    • Markdown 转 email
    • github travis ci 自动部署
    • 浏览器缓存知识梳理
    • WEB 系统登录相关知识梳理
    • 将-Axios-请求参数和返回值进行格式化
    • source-map与源码调试
    • HTTPS
    • 使用 rollup 打造自己的 npm 包 (全流程)
    • father-build 是如何工作的
  • 书籍
    • 图解 HTTP 协议
    • 编写可维护的 JavaScript
    • 鸟哥的 Linux 私房菜
    • JavaScript Promise迷你书
  • Linux
    • vimtutor
    • CURL 使用指南
  • Nginx
    • 一次 nginx 分享
  • Git
    • Git Commit Message 须知
    • .gitignore 模板
    • git tag标签
  • 摄影
    • 摄影基础知识
    • 手机摄影从小白到大师
  • 翻译
    • log4js
    • log4js-node
    • 介绍GitLab上的CI/CD
    • 为GitLab Pages创建并调整GitLab CI/CD
    • 关于 rel=noopener
    • AngularJS 团队 Git 提交信息约定
    • JSON Schema
  • Lifehack
    • 20 个 Google 搜索 Tips 来高效使用 Google
    • 37 个高级 Google 搜索 Tips
Powered by GitBook
On this page
  • 1. 它在解决什么问题
  • 2. 推荐做法
  • 3. 说明
  • 4. Bug 追随清单

Was this helpful?

  1. 翻译

关于 rel=noopener

Previous为GitLab Pages创建并调整GitLab CI/CDNextAngularJS 团队 Git 提交信息约定

Last updated 4 years ago

Was this helpful?

1. 它在解决什么问题

你当前正在查看 index.html

想象下以下是用户在你的网站上生成的内容:

<a class="user-generated" href="malicious.html" target="_blank">
    <b>Click me!!1 (同域)</b>
</a>

点击以上的链接打开 malicious.html 在一个新的标签页上(使用 target=_blank). 本身,这并不令人兴奋。

但是,malicious.html 文档在新的标签页有一个 window.opener 属性指向当前你正在看的HTML文档的 window 对象,例如这个: index.html

这意味着,如果用户点击了这个链接,malicaous.html 能够完全的控制当前文档的 window 对象。

请记住即使 index.html 和 malicaous.html 属于不同的域这也是有效的,window.opener.location 跨域情况下依然能获取到!(虽然 window.opener.document 在跨域的情况下获取不到,也是无效的),以下是一个跨域的链接:

<a class="user-generated" href="https://mathiasbynens.be/demo/opener" target="_blank">
<b>Click me!!1 (跨域)</b>
</a>

malicious将当前页面 index.html 换成了 index.html#hax, 这使得当前页面展示了一个隐藏信息。这是个相对来说无害的例子,但是取而代之的可以是重定向到一个钓鱼网站,设计得就像真的 index.html 一样,要求你登录。用户不会注意到这些,因为注意力在新开的 malicaous 页面,然而重定向发生在后台。攻击可以通过在重定向到钓鱼网站之前增加延迟使得更为巧妙().

如果 window.opener 被设置了,一个页面可以无视安全源触发 opener 页面的导航。

2. 推荐做法

为了避免页面滥用 window.opener 使用 rel=opener,在 Chrome 49 & Opear 36, Firefox 52, Desktop Safari 10.1+ 和 iOS Safari 10.3+中 它能够保证 window.opener 是 null.

<a class="user-generated" href="malicious.html" target="_blank" rel="noopener">
<b>Click me!!1 (使用 rel=noopener)</b>
</a>

对于更老的浏览器,你可以设置 rel=noreferer, 这样也能禁用掉 Referer 的 HTTP 头, 或者以下的 JavaScript 代码可能会触发弹出式窗口的拦截器:

var otherWindow = window.open();
otherWindow.opener = null;
otherWindow.location = url;
<a class="user-generated" href="malicious.html" target="_blank" rel="noreferrer">
<b>Click me!!1 (now with <code>rel=noreferrer</code>-based workaround)</b>
</a>
<a class="user-generated" href="malicious.html" target="_blank" onclick="var otherWindow = window.open(); otherWindow.opener = null; otherWindow.location = href; return false;">
<b>Click me!!1 (now with <code>window.open()</code>-based workaround)</b>
</a>

3. 说明

4. Bug 追随清单

记住 ,为了 Safari 的支持,插入一个隐藏的 iframe 去打开新的页面,然后立刻移除 iframe.

不要使用 target="_blank"(或者其他的 target 打开新的导航上下文),尤其是对于那些用户生成的链接内容,除非你有这样做。

在 Safari Technology Preview 68, 锚点上的 target="_blank" 意味这 rel="noopener", 如果明确的选择保留 window.opener,使用 rel="opener",

英文原版
CORS
查看
基于JavaScript的方式在Safari上无效
好的理由
查看这里
Gecko/Firefox bug #1222516
WebKit/Safari bug #155166
Microsoft Edge feature request
Chromium/Chrome/Opera bug #168988