# 点击劫持保护 #
点击劫持中间件和装饰器提供了简捷易用的,对[点击劫持](http://en.wikipedia.org/wiki/Clickjacking)的保护。这种攻击在恶意站点诱导用户点击另一个站点的被覆盖元素时出现,另一个站点已经加载到了隐藏的`frame`或`iframe`中。
## 点击劫持的示例 ##
假设一个在线商店拥有一个页面,已登录的用户可以点击“现在购买”来购买一个商品。用户为了方便,可以选择一直保持商店的登录状态。一个攻击者的站点可能在他们自己的页面上会创建一个“我喜欢Ponies”的按钮,并且在一个透明的`iframe`中加载商店的页面,把“现在购买”的按钮隐藏起来覆盖在“我喜欢Ponies”上。如果用户访问了攻击者的站点,点击“我喜欢Ponies”按钮会触发对“现在购买”按钮的无意识的点击,不知不觉中购买了商品。
## 点击劫持的防御 ##
现代浏览器遵循[X-Frame-Options](https://developer.mozilla.org/en/The_X-FRAME-OPTIONS_response_header)协议头,它表明一个资源是否允许加载到`frame`或者`iframe`中。如果响应包含值为`SAMEORIGIN`的协议头,浏览器会在`frame`中只加载同源请求的的资源。如果协议头设置为`DENY`,浏览器会在加载`frame`时屏蔽所有资源,无论请求来自于哪个站点。
Django提供了一些简单的方法来在你站点的响应中包含这个协议头:
+ 一个简单的中间件,在所有响应中设置协议头。
+ 一系列的视图装饰器,可以用于覆盖中间件,或者只用于设置指定视图的协议头。
## 如何使用 ##
### 为所有响应设置X-Frame-Options ###
要为你站点中所有的响应设置相同的`X-Frame-Options`值,将`'django.middleware.clickjacking.XFrameOptionsMiddleware'`设置为 `MIDDLEWARE_CLASSES`:
```
MIDDLEWARE_CLASSES = (
...
'django.middleware.clickjacking.XFrameOptionsMiddleware',
...
)
```
这个中间件可以在startproject生成的设置文件中开启。
通常,这个中间件会为任何开放的`HttpResponse`设置`X-Frame-Options`协议头为`SAMEORIGIN`。如果你想用 `DENY`来替代它,要设置`X_FRAME_OPTIONS`:
```
X_FRAME_OPTIONS = 'DENY'
```
使用这个中间件时可能会有一些视图,你并不想为它设置`X-Frame-Options`协议头。对于这些情况,你可以使用一个视图装饰器来告诉中间件不要设置协议头:
```
from django.http import HttpResponse
from django.views.decorators.clickjacking import xframe_options_exempt
@xframe_options_exempt
def ok_to_load_in_a_frame(request):
return HttpResponse("This page is safe to load in a frame on any site.")
```
### 为每个视图设置 X-Frame-Options ###
Django提供了以下装饰器来为每个基础视图设置`X-Frame-Options`协议头。
```
from django.http import HttpResponse
from django.views.decorators.clickjacking import xframe_options_deny
from django.views.decorators.clickjacking import xframe_options_sameorigin
@xframe_options_deny
def view_one(request):
return HttpResponse("I won't display in any frame!")
@xframe_options_sameorigin
def view_two(request):
return HttpResponse("Display in a frame if it's from the same origin as me.")
```
注意你可以在中间件的连接中使用装饰器。使用装饰器来覆盖中间件。
## 限制 ##
`X-Frame-Options`协议头只在现代浏览器中保护点击劫持。老式的浏览器会忽视这个协议头,并且需要 [其它点击劫持防范技巧](http://en.wikipedia.org/wiki/Clickjacking#Prevention)。
### 支持 X-Frame-Options 的浏览器 ###
+ Internet Explorer 8+
+ Firefox 3.6.9+
+ Opera 10.5+
+ Safari 4+
+ Chrome 4.1+
### 另见 ###
浏览器对`X-Frame-Options`支持情况的[完整列表](https://developer.mozilla.org/en/The_X-FRAME-OPTIONS_response_header#Browser_compatibility)。
> 译者:[Django 文档协作翻译小组](http://python.usyiyi.cn/django/index.html),原文:[Clickjacking protection](https://docs.djangoproject.com/en/1.8/ref/clickjacking/)。
>
> 本文以 [CC BY-NC-SA 3.0](http://creativecommons.org/licenses/by-nc-sa/3.0/cn/) 协议发布,转载请保留作者署名和文章出处。
>
> [Django 文档协作翻译小组](http://python.usyiyi.cn/django/index.html)人手紧缺,有兴趣的朋友可以加入我们,完全公益性质。交流群:467338606。
- 新手入门
- 从零开始
- 概览
- 安装
- 教程
- 第1部分:模型
- 第2部分:管理站点
- 第3部分:视图和模板
- 第4部分:表单和通用视图
- 第5部分:测试
- 第6部分:静态文件
- 高级教程
- 如何编写可重用的应用
- 为Django编写首个补丁
- 模型层
- 模型
- 模型语法
- 元选项
- 模型类
- 查询集
- 执行查询
- 查找表达式
- 模型的实例
- 实例方法
- 访问关联对象
- 迁移
- 模式编辑器
- 编写迁移
- 高级
- 管理器
- 原始的SQL查询
- 聚合
- 多数据库
- 自定义查找
- 条件表达式
- 数据库函数
- 其它
- 遗留的数据库
- 提供初始数据
- 优化数据库访问
- 视图层
- 基础
- URL配置
- 视图函数
- 快捷函数
- 装饰器
- 参考
- 内建的视图
- TemplateResponse 对象
- 文件上传
- 概览
- File 对象
- 储存API
- 管理文件
- 自定义存储
- 基于类的视图
- 概览
- 内建显示视图
- 内建编辑视图
- API参考
- 分类索引
- 高级
- 生成 CSV
- 生成 PDF
- 中间件
- 概览
- 内建的中间件类
- 模板层
- 基础
- 面向设计师
- 语言概览
- 人性化
- 面向程序员
- 表单
- 基础
- 概览
- 表单API
- 内建的Widget
- 高级
- 整合媒体
- 开发过程
- 设置
- 概览
- 应用程序
- 异常
- 概览
- django-admin 和 manage.py
- 添加自定义的命令
- 测试
- 介绍
- 部署
- 概述
- WSGI服务器
- 部署静态文件
- 通过email追踪代码错误
- Admin
- 管理操作
- 管理文档生成器
- 安全
- 安全概述
- 说明Django中的安全问题
- 点击劫持保护
- 加密签名
- 国际化和本地化
- 概述
- 本地化WEB UI格式化输入
- “本地特色”
- 常见的网站应用工具
- 认证
- 概览
- 使用认证系统
- 密码管理
- 日志
- 分页
- 会话
- 数据验证
- 其它核心功能
- 按需内容处理
- 重定向
- 信号
- 系统检查框架