🎨
Notes
  • 持续更新中...
  • articles
    • browser
      • 深入理解现代浏览器 - 导航
      • 深入理解现代浏览器 - 架构
      • 深入理解现代浏览器 - 交互
      • 深入理解现代浏览器 - 渲染器进程
    • dsa
      • DSA - 并查集
      • DSA - 哈希表
      • DSA - AVL 树
      • DSA - 二叉树
      • 快速选择
      • Big O 算法复杂度
      • DSA - 栈和队列
      • DSA - 前缀树 Trie
      • DSA - 图
      • DSA - 链表
      • DSA - 递归
    • typescript
      • TypeScript 学习笔记 - 任意属性 (Indexable Types)
      • 力扣的 TypeScript 面试题
      • TypeScript 学习笔记 - as const
      • TypeScript 学习笔记 - infer
    • network
      • Internet Protocol (IP)
      • 计算机网络基础
      • 如何分辨同源和同站
      • DNS 如何查询 IP 地址?
    • vue
      • Nuxt.js 入门
      • 从零实现一个 Mini Vue
      • 从零实现一个简单的 VDOM 引擎
      • 从零实现一个响应式状态管理
    • sorting
      • 排序 - 归并排序
      • 排序 - 冒泡排序
      • 排序 - 选择排序
      • 排序 - 计数排序
      • 排序 - 插入排序
    • compile
      • Compiler and Interpreter
      • Just-In-Time (JIT) Compilers
      • 编译流程
    • others
      • 什么是上下文无关语法
      • 如何在终端打印出有颜色的字
    • dev-ops
      • github-actions
        • GitHub Action 简介
        • GitHub Actions for CI
    • workflow
      • 用 Node 写一个 cli
      • 如何规范 git commit 信息
      • 如何监听 git hooks
      • 如何规范代码风格 - prettier
      • 如何发布一个 npm package
      • 如何规范代码质量 - eslint
    • design-pattern
      • 代理模式
      • 单例模式
      • 策略模式
    • security
      • 点击劫持
      • CSP 内容安全策略
    • javascript
      • 尾调用优化
      • 4种常见的内存泄漏及解决方法
    • unit-test
      • Test Vuejs Application - Chapter 2
      • Test Vuejs Application - Chapter 1
      • Vue Unit Test Intro
    • performance
      • HTTP 缓存
      • 如何优化图片资源
Powered by GitBook
On this page
  • 什么是点击劫持?
  • 如何防御点击劫持?
  • JS 防御
  • X-Frame-Options
  • Content Security Policy (CSP)

Was this helpful?

  1. articles
  2. security

点击劫持

什么是点击劫持?

点击劫持是一种视觉欺骗的攻击手段,攻击方诱导用户点击一个看不见的网页或者经过伪装的元素,实际上用户点击的并不是自己看到的网页,而是这个网页上层的一个透明网页,这种攻击可能会导致用户下载恶意软件、泄露个人信息、或者在不知情的情况下进行转账、购物等等。

一般情况下,攻击方是把需要攻击的网站通过 iframe 嵌入到自己的网页中,再设置其为透明或伪装成其他元素。用户访问攻击方的网页,可能会看到一个“领取免费礼物”的按钮,但实际上用户点击这个按钮,却是点击了这个按钮上方的透明网页,这个看不见的网页可能是用户的银行转账页面,而用户点击了按钮之后,就同意转账了。

p.s. 因为浏览器可能会对透明的 iframe 做一些安全检测,所以攻击方可能会把网页设置成 opacity: 0.0001; 之类的,越过浏览器的检测阈值。

如何防御点击劫持?

  1. 客户端防御:JS 防御

  2. 服务器防御:X-Frame-Options 和 Content Security Policy (CSP)

JS 防御

  • 检查当前网页的 window 是否 top-window,如果不是,那就把它改成 top-window

  • 把所有 frame 都设为不透明的

  • 阻止透明 frame 上的点击事件

  • ...

但 JS 防御很容易被绕过,比如浏览器可能设置了禁止执行 JS 脚本,或者攻击方可能会利用 HTML5 iframe 的 sandbox 属性。

X-Frame-Options

X-Frame-Options 是一个 HTTP 响应头部字段,用来控制浏览器是否可以在 <frame> 或者 <iframe> 标签中展示当前页面,有以下几个可以设置的值:

  • DENY: 不允许任何网站在 iframe 中展示当前网页

  • SAMEORIGIN: 在域名相同的情况下,可以允许将当前页面在 iframe 中展示

  • ALLOW-FROM URI: 在指定的 URI 中,允许当前页面在 iframe 中展示

缺点

  1. 如果要使用 SAMEORIGIN,需要在网站的每一个单独的页面中都返回 X-Frame-Options 头部

  2. 使用 ALLOW-FROM URI 的时候,不支持设置多个 URI

  3. X-Frame-Options 只能设置一个值

  4. 大部分浏览器都不支持 ALLOW-FROM 选项

  5. X-Frame-Options 在大部分浏览器中已经被丢弃

Content Security Policy (CSP)

Content Security Policy 也是一个 HTTP 响应头部,我们可以通过设置 frame-ancestors 指令来指定哪些源可以通过 <iframe> 等方式来展示当前页面,可以指定一个或多个源。

用法

Content-Security-Policy: frame-ancestors <source> <source>;

e.g.

Content-Security-Policy: frame-ancestors 'none';

Content-Security-Policy: frame-ancestors 'self' https://www.example.org;
  • none: 是一个关键字,跟 X-Frame-Options 的 DENY 一样

  • self: 是一个关键字,跟 X-Frame-Options 的 SAMEORIGIN 一样

  • 此外还可以指定多个 URI

READING

PrevioussecurityNextCSP 内容安全策略

Last updated 4 years ago

Was this helpful?

(notes: read the extension readings in this blog when you got time)

https://www.imperva.com/learn/application-security/clickjacking/
https://portswigger.net/web-security/clickjacking