# 第三节:点击劫持攻击
# clickjacking攻击:
`clickjacking`攻击又称作**点击劫持攻击**。是一种在网页中将恶意代码等隐藏在看似无害的内容(如按钮)之下,并诱使用户点击的手段。
## clickjacking攻击场景:
### 场景一:
如用户收到一封包含一段视频的电子邮件,但其中的“播放”按钮并不会真正播放视频,而是链入一购物网站。这样当用户试图“播放视频”时,实际是被诱骗而进入了一个购物网站。
### 场景二:
用户进入到一个网页中,里面包含了一个非常有诱惑力的`按钮A`,但是这个按钮上面浮了一个透明的`iframe`标签,这个`iframe`标签加载了另外一个网页,并且他将这个网页的某个按钮和原网页中的`按钮A`重合,所以你在点击`按钮A`的时候,实际上点的是通过`iframe`加载的另外一个网页的按钮。比如我现在有一个百度贴吧,想要让更多的用户来关注,那么我们可以准备以下一个页面:
```
<pre class="calibre12">```
<span class="hljs-class"></span>
<span class="hljs-tag"><<span class="hljs-class">html</span>></span>
<span class="hljs-tag"><<span class="hljs-class">meta</span> <span class="hljs-class">http-equiv</span>=<span class="hljs-string">"Content-Type"</span> <span class="hljs-class">content</span>=<span class="hljs-string">"text/html; charset=gb2312"</span> /></span>
<span class="hljs-tag"><<span class="hljs-class">head</span>></span>
<span class="hljs-tag"><<span class="hljs-class">title</span>></span>点击劫持<span class="hljs-tag"></<span class="hljs-class">title</span>></span>
<span class="hljs-tag"><<span class="hljs-class">style</span>></span><span class="hljs-class">
<span class="hljs-class">iframe</span>{
<span class="hljs-tag">opacity</span>:<span class="hljs-params">0.01</span>;
<span class="hljs-tag">position</span>:absolute;
<span class="hljs-tag">z-index</span>:<span class="hljs-params">2</span>;
<span class="hljs-tag">width</span>: <span class="hljs-params">100%</span>;
<span class="hljs-tag">height</span>: <span class="hljs-params">100%</span>;
}
<span class="hljs-class">button</span>{
<span class="hljs-tag">position</span>:absolute;
<span class="hljs-tag">top</span>: <span class="hljs-params">345px</span>;
<span class="hljs-tag">left</span>: <span class="hljs-params">630px</span>;
<span class="hljs-tag">z-index</span>: <span class="hljs-params">1</span>;
<span class="hljs-tag">width</span>: <span class="hljs-params">72px</span>;
<span class="hljs-tag">height</span>: <span class="hljs-params">26px</span>;
}
</span><span class="hljs-tag"></<span class="hljs-class">style</span>></span>
<span class="hljs-tag"></<span class="hljs-class">head</span>></span>
<span class="hljs-tag"><<span class="hljs-class">body</span>></span>
这个合影里面怎么会有你?
<span class="hljs-tag"><<span class="hljs-class">button</span>></span>查看详情<span class="hljs-tag"></<span class="hljs-class">button</span>></span>
<span class="hljs-tag"><<span class="hljs-class">iframe</span> <span class="hljs-class">src</span>=<span class="hljs-string">"http://tieba.baidu.com/f?kw=%C3%C0%C5%AE"</span>></span><span class="hljs-tag"></<span class="hljs-class">iframe</span>></span>
<span class="hljs-tag"></<span class="hljs-class">body</span>></span>
<span class="hljs-tag"></<span class="hljs-class">html</span>></span>
```
```
```
<pre class="calibre12">```
页面看起来比较简陋,但是实际上可能会比这些更精致一些。当这个页面通过某种手段被传播出去后,用户如果点击了“查看详情”,实际上点击到的是关注的按钮,这样就可以增加了一个粉丝。
```
```
## clickjacking防御:
像以上场景1,是没有办法避免的,受伤害的是用户。而像场景2,受伤害的是百度贴吧网站和用户。这种场景是可以避免的,只要设置百度贴吧不允许使用`iframe`被加载到其他网页中,就可以避免这种行为了。我们可以通过在响应头中设置`X-Frame-Options`来设置这种操作。`X-Frame-Options`可以设置以下三个值:
1. `DENY`:不让任何网页使用`iframe`加载我这个页面。
2. `SAMEORIGIN`:只允许在相同域名(也就是我自己的网站)下使用`iframe`加载我这个页面。
3. `ALLOW-FROM origin`:允许任何网页通过`iframe`加载我这个网页。
在`Django`中,使用中间件`django.middleware.clickjacking.XFrameOptionsMiddleware`可以帮我们堵上这个漏洞,这个中间件设置了`X-Frame-Option`为`SAMEORIGIN`,也就是只有在自己的网站下才可以使用`iframe`加载这个网页,这样就可以避免其他别有心机的网页去通过`iframe`去加载了。
- Introduction
- 第一章:学前准备
- 第一节:虚拟环境
- 第二节:准备工作
- 第三节:Django介绍
- 第四节:URL组成部分
- 第二章:URL与视图
- 第一节:第一个Django项目
- 第二节:视图与URL分发器
- 第三章:模板
- 第一节:模板介绍
- 第二节:模板变量
- 第三节:常用标签
- 第四节:常用过滤器
- 第五节:自定义过滤器
- 第七节:模版结构优化
- 第八节:加载静态文件
- 第四章:数据库
- 第一节:MySQL相关软件
- 第二节:数据库操作
- 第三节:ORM模型
- 第四节:模型常用字段
- 第五节:外键和表关系
- 第六节:增删改查操作
- 第七节:查询操作
- 第八节:QuerySet API
- 第九节:ORM模型迁移
- 第十节:ORM作业
- 第十一节:ORM作业参考答案
- 第十二节:Pycharm连接数据库
- 第五章:视图高级
- 第一节:限制请求method
- 第二节:页面重定向
- 第三节:HttpRequest对象
- 第四节:HttpResponse对象
- 第五节:生成CSV文件
- 第六节:类视图
- 第七节:错误处理
- 第六章:表单
- 第一节:表单概述
- 第二节:用表单验证数据
- 第三节:ModelForm
- 第四节:文件上传
- 第七章:cookie和session
- 第八章:上下文处理器和中间件
- 第一节:上下文处理器
- 第二节:中间件
- 第九章:安全
- 第一节:CSRF攻击
- 第二节:XSS攻击
- 第三节:点击劫持攻击
- 第四节:SQL注入
- 第十章:信号
- 第一节:什么是信号
- 第十一章:验证和授权
- 第一节:概述
- 第二节:用户对象
- 第三节:权限和分组
- 第十二章:Admin系统
- 第十三章:Django的缓存
- 第十四章:memcached
- 第十五章:Redis