点击防护¶
点击劫持中间件和装饰器提供易于使用的 clickjacking 保护。当恶意网站欺骗用户点击在隐藏帧或iframe中加载的另一站点的隐藏元素时,发生这种类型的攻击。
点击劫持的一个例子¶
假设在线商店有一个页面,其中登录的用户可以点击“立即购买”购买项目。用户已经选择保持登录到商店所有的时间为了方便。攻击者网站可能会在自己的某个页面上创建一个“我喜欢小马”按钮,并在一个透明的iframe中加载商店的页面,这样“立即购买”按钮就隐藏在“我喜欢小马”按钮上。如果用户访问攻击者的网站,点击“我喜欢小马”将导致意外点击“立即购买”按钮和该项目的未知购买。
防止点击劫持¶
现代浏览器尊重 X-Frame-Options HTTP头,指示是否允许资源在帧或iframe内加载。如果响应包含值为 SAMEORIGIN
的头,那么浏览器将只在框架中加载资源,如果请求来自同一个站点。如果头设置为 DENY
,则浏览器将阻止资源在框架中加载,而不管请求是哪个站点。
Django提供了几个简单的方法,将此标题包含在您网站的响应中:
一个简单的中间件,在所有响应中设置标头。
一组视图修饰器,可用于覆盖中间件或仅设置特定视图的头。
只有中间件或视图修饰器在响应中不存在时,X-Frame-Options
HTTP头才会设置。
如何使用它¶
为所有响应设置 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.")
请注意,您可以将装饰器与中间件结合使用。使用装饰器覆盖中间件。
限制¶
X-Frame-Options
头部只能防止在现代浏览器中的劫持。旧版浏览器会静默忽略标题,需要 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
的浏览器的 complete list。