点击顶升保护

Clickjacking中间件和修饰符提供了易于使用的保护 clickjacking . 当恶意站点欺骗用户点击另一个站点的隐藏元素时,就会发生这种类型的攻击,这些隐藏元素已经被加载到隐藏框架或iframe中。

点击劫持的一个例子

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

防止点击劫持

现代浏览器向 X-Frame-Options 指示是否允许在帧或iframe中加载资源的HTTP头。如果响应包含值为的头 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"

使用中间件时,可能会有一些视图 not 想要 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.")

备注

如果要提交表单或访问frame或iframe中的会话cookie,则可能需要修改 CSRF_COOKIE_SAMESITESESSION_COOKIE_SAMESITE 设置。

Changed in 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.")

请注意,可以将修饰符与中间件结合使用。使用decorator会覆盖中间件。

Changed in Django 5.0:

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

局限性

这个 X-Frame-Options 在现代浏览器中,标题只能防止点击劫持。较旧的浏览器会悄悄地忽略标题并需要 other clickjacking prevention techniques .

支持的浏览器 X-Frame-Options

  • Internet Explorer 8+

  • 边缘

  • 火狐3.69+

  • 歌剧10.5 +

  • 狩猎4号

  • 铬4.1+

另见

A complete list 支持的浏览器数 X-Frame-Options .