现代浏览器通过x-frame-options http头部来判断资源是否可在frame或iframe中加载。
X-Frame-Options: DENY
X-Frame-Options: SAMEORIGIN
X-Frame-Options: ALLOW-FROM https://example.com/
django可以设置一个中间件,这样保护所有的页面。
django可以使用装饰器来防护一些视图。
MIDDLEWARE_CLASSES = (
...
'django.middleware.clickjacking.XFrameOptionsMiddleware',
...
)
默认设置为同源的SAMEORIGIN,可以在设置中指定:
X_FRAME_OPTIONS = 'DENY'
对一些视图不保护:
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.")
from django.views.decorators.clickjacking import xframe_options_deny
from django.views.decorators.clickjacking import xframe_options_sameorigin
但是,老式的浏览器不支持(可以考虑js中判断)。