django 1.8 官方文档翻译: 8-3 点击劫持保护

简介: 点击劫持保护点击劫持中间件和装饰器提供了简捷易用的,对点击劫持的保护。这种攻击在恶意站点诱导用户点击另一个站点的被覆盖元素时出现,另一个站点已经加载到了隐藏的frame或iframe中。

点击劫持保护

点击劫持中间件和装饰器提供了简捷易用的,对点击劫持的保护。这种攻击在恶意站点诱导用户点击另一个站点的被覆盖元素时出现,另一个站点已经加载到了隐藏的frameiframe中。

点击劫持的示例

假设一个在线商店拥有一个页面,已登录的用户可以点击“现在购买”来购买一个商品。用户为了方便,可以选择一直保持商店的登录状态。一个攻击者的站点可能在他们自己的页面上会创建一个“我喜欢Ponies”的按钮,并且在一个透明的iframe中加载商店的页面,把“现在购买”的按钮隐藏起来覆盖在“我喜欢Ponies”上。如果用户访问了攻击者的站点,点击“我喜欢Ponies”按钮会触发对“现在购买”按钮的无意识的点击,不知不觉中购买了商品。

点击劫持的防御

现代浏览器遵循X-Frame-Options协议头,它表明一个资源是否允许加载到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协议头只在现代浏览器中保护点击劫持。老式的浏览器会忽视这个协议头,并且需要 其它点击劫持防范技巧

支持 X-Frame-Options 的浏览器

  • Internet Explorer 8+
  • Firefox 3.6.9+
  • Opera 10.5+
  • Safari 4+
  • Chrome 4.1+

另见

浏览器对X-Frame-Options支持情况的完整列表

译者:Django 文档协作翻译小组,原文:Clickjacking protection

本文以 CC BY-NC-SA 3.0 协议发布,转载请保留作者署名和文章出处。

Django 文档协作翻译小组人手紧缺,有兴趣的朋友可以加入我们,完全公益性质。交流群:467338606。

相关文章
|
中间件 Python
django 1.8 官方文档翻译: 3-6-1 中间件概览
Django 文档协作翻译小组人手紧缺,有兴趣的朋友可以加入我们,完全公益性质。 交流群:467338606 网站:http://python.usyiyi.cn/django/index.html 中间件 中间件是一个介入Django的请求和响应的处理过程中的钩子框架。
1210 53
|
前端开发 Python
django 1.8 官方文档翻译: 3-4-3 使用基于类的视图处理表单
使用基于类的视图处理表单 表单的处理通常有3 个步骤: 初始的的GET (空白或预填充的表单) 带有非法数据的POST(通常重新显示表单和错误信息) 带有合法数据的POST(处理数据并重定向) 你自己实现这些功能经常导致许多重复的样本代码(参见在视图中使用表单)。
1136 0
|
缓存 Python 安全
django 1.8 官方文档翻译: 3-1-4 视图装饰器
视图装饰器 Django为视图提供了数个装饰器,用以支持相关的HTTP服务。 允许的HTTP 方法 django.views.decorators.http 包里的装饰器可以基于请求的方法来限制对视图的访问。
1157 0
|
算法 调度 Python
django 1.8 官方文档翻译: 3-1-1 URL调度器
URL调度器 简洁、优雅的URL 模式在高质量的Web 应用中是一个非常重要的细节。Django 允许你任意设计你的URL,不受框架束缚。
1094 0
|
Python 前端开发
django 1.8 官方文档翻译: 3-1-3 Django 的快捷函数
Django 的快捷函数 django.shortcuts 收集了“跨越” 多层MVC 的辅助函数和类。 换句话讲,这些函数/类为了方便,引入了可控的耦合。
1039 0
|
Shell Python 数据安全/隐私保护
django 1.8 官方文档翻译: 6-1-1 Django 的设置
Django 的设置 Django 的设置文件包含你安装的Django 的所有配置。这页文档解释设置是如何工作以及有哪些设置。
1289 0
|
Python
django 1.8 官方文档翻译: 6-4-2 编写自定义的django-admin命令
编写自定义的django-admin命令 应用可以通过manage.py注册它们自己的动作。例如,你可能想为你正在发布的Django应用添加一个manage.py动作。
1062 0
|
Python
django 1.8 官方文档翻译: 4-2-4 人性化
Django 文档协作翻译小组人手紧缺,有兴趣的朋友可以加入我们,完全公益性质。 交流群:467338606 网站:http://python.usyiyi.cn/django/index.html django.contrib.humanize 一系列Django的模板过滤器,有助于向数据添加“人文关怀”。
924 0
|
数据库 Python 开发者
django 1.8 官方文档翻译: 3-4-2 内建显示视图
Django 文档协作翻译小组人手紧缺,有兴趣的朋友可以加入我们,完全公益性质。 交流群:467338606 网站:http://python.usyiyi.cn/django/index.html 基于类的内建通用视图 编写Web应用可能是单调的,因为你需要不断的重复某一种模式。
915 0
|
Python 数据库
django 1.8 官方文档翻译: 2-3-2 关联对象参考
Django 文档协作翻译小组人手紧缺,有兴趣的朋友可以加入我们,完全公益性质。 交流群:467338606 网站:http://python.usyiyi.cn/django/index.html 关联对象参考 class RelatedManager “关联管理器”是在一对多或者多对多的关联上下文中使用的管理器。
945 0