点击劫持保护 — Django 文档

来自菜鸟教程
Django/docs/3.1.x/ref/clickjacking
跳转至:导航、​搜索

点击劫持保护

点击劫持中间件和装饰器提供易于使用的保护,防止 点击劫持 。 当恶意站点诱使用户单击他们已加载到隐藏框架或 iframe 中的另一个站点的隐藏元素时,就会发生这种类型的攻击。

点击劫持的一个例子

假设在线商店有一个页面,登录用户可以在其中单击“立即购买”来购买商品。 为方便起见,用户选择始终登录商店。 攻击者站点可能会在他们自己的一个页面上创建一个“我喜欢小马”按钮,并在透明的 iframe 中加载商店页面,这样“立即购买”按钮就隐藏在“我喜欢小马”按钮上。 如果用户访问攻击者的站点,单击“我喜欢小马”将导致无意中单击“立即购买”按钮并在不知情的情况下购买该项目。


防止点击劫持

现代浏览器遵循 X-Frame-Options HTTP 标头,指示是否允许在框架或 iframe 内加载资源。 如果响应包含值为 SAMEORIGIN 的标头,则浏览器将仅在请求来自同一站点的情况下加载框架中的资源。 如果标头设置为 DENY,那么无论哪个站点发出请求,浏览器都会阻止资源加载到框架中。

Django 提供了几种方法来在您站点的响应中包含此标头:

  1. 在所有响应中设置标头的中间件。
  2. 一组视图装饰器,可用于覆盖中间件或仅为某些视图设置标题。

X-Frame-Options HTTP 标头仅在响应中尚未出现时由中间件或视图装饰器设置。


如何使用它

为所有响应设置 X-Frame-Options

要为站点中的所有响应设置相同的 X-Frame-Options 值,请将 'django.middleware.clickjacking.XFrameOptionsMiddleware' 设置为 :setting:`MIDDLEWARE`

MIDDLEWARE = [
    ...
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    ...
]

这个中间件在 :djadmin:`startproject` 生成的设置文件中启用。

默认情况下,对于每个传出的 HttpResponse,中间件会将 X-Frame-Options 标头设置为 DENY。 如果您想要此标头的任何其他值,请设置 :setting:`X_FRAME_OPTIONS` 设置:

X_FRAME_OPTIONS = 'SAMEORIGIN'

3.0 版本更改: :setting:`X_FRAME_OPTIONS` 设置的默认值从 SAMEORIGIN 更改为 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.")

笔记

如果您想在框架或 iframe 中提交表单或访问会话 cookie,您可能需要修改 :setting:`CSRF_COOKIE_SAMESITE`:setting:`SESSION_COOKIE_SAMESITE` 设置.


按视图设置 X-Frame-Options

为了在每个视图的基础上设置 X-Frame-Options 标头,Django 提供了这些装饰器:

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 的浏览器

  • 浏览器 8+
  • 边缘
  • 火狐 3.6.9+
  • 歌剧 10.5+
  • 野生动物园 4+
  • 铬 4.1+


另见

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