Clickjacking保护

The clickjacking middleware and decorators provide easy-to-use protection against clickjacking. 这种类型的攻击发生在恶意网站欺骗用户点击隐藏框架或iframe中加载的其他网站的隐藏元素时。

clickjacking 的一个例子

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

防止clickjacking

Modern browsers honor the X-Frame-Options HTTP header that indicates whether or not a resource is allowed to load within a frame or iframe. 如果响应包含的值为SAMEORIGIN,那么如果请求来自同一个站点,浏览器将只在一个帧中加载资源。 如果标题设置为DENY,那么无论哪个站点发出请求,浏览器都会阻止资源加载到框架中。

Django提供了一些简单的方法在你的站点的响应中包含这个头文件:

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

The X-Frame-Options HTTP header will only be set by the middleware or view decorators if it is not already present in the response.

如何使用

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

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

MIDDLEWARE = [
    ...
    '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

要在每个视图的基础上设置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.")

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

限制¶ T0>

这个X-Frame-Options标题只能防止在现代浏览器中发生点击劫持。 Older browsers will quietly ignore the header and need other clickjacking prevention techniques.

支持X-Frame-Options 的浏览器

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

另见

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