点击劫持保护

点击劫持中间件和装饰器提供了针对 点击劫持 的易用保护。当恶意网站欺骗用户点击他们在隐藏框架或 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' 放入 MIDDLEWARE

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

此中间件在 startproject 生成的设置文件中启用。

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

X_FRAME_OPTIONS = "SAMEORIGIN"

在使用中间件时,可能有一些视图您希望设置 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,您可能需要修改 CSRF_COOKIE_SAMESITESESSION_COOKIE_SAMESITE 设置。

在 Django 5.0 中更改

@xframe_options_exempt 装饰器添加了对包装异步视图函数的支持。

为每个视图设置 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.")

请注意,您可以将装饰器与中间件结合使用。使用装饰器将覆盖中间件。

在 Django 5.0 中更改

@xframe_options_deny@xframe_options_sameorigin 装饰器添加了对包装异步视图函数的支持。

限制

X-Frame-Options 标头仅在 现代浏览器 中防止点击劫持。

返回顶部