点击劫持保护

    假设一家在线商店有一个页面,登录的用户可以点击“立即购买”来购买商品。用户为了方便,选择了保持登录商店。攻击者网站可能会在自己的一个页面上创建一个“I Like Ponies”按钮,并在一个透明的 iframe 中加载商店的页面,使“立即购买”按钮无形中覆盖在“I Like Ponies”按钮上。如果用户访问攻击者的网站,点击“I Like Ponies”将导致无意中点击“立即购买”按钮,并在不知情的情况下购买该商品。

    现代浏览器尊重 HTTP 头,它表明是否允许在框架或 iframe 中加载资源。如果响应包含值为 SAMEORIGIN 的头,那么只有当请求来自同一个网站时,浏览器才会在框架中加载资源。如果头被设置为 DENY,那么无论请求是由哪个网站发出的,浏览器都会阻止资源在框架中加载。

    Django 提供了一些方法来在你的网站的响应中包含这个头:

    1. 一个在所有响应中设置头的中间件。

    X-Frame-Options HTTP 头只有在响应中还没有出现的情况下,才会被中间件或视图装饰者设置。

    这个中间件在 startproject 生成的配置文件中启用了。

    默认情况下,中间件将为每个传出的 HttpResponse 设置 X- Frame-Options 头为 DENY。如果你想为这个头设置任何其他的值,可以设置 配置:

    在使用中间件时,有些视图可能 不希望 设置 X- Frame-Options 头。对于这些情况,你可以使用一个视图装饰器,告诉中间件不要设置头:

    注解

    要在每个视图上设置 X-Frame-Options 头,Django 提供了这些装饰器:

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

    X-Frame-Options 头只能在现代浏览器中防止点击劫持。旧的浏览器会悄悄地忽略这个头,需要 其他的防止点击劫持技术

    • Internet Explorer 8+
    • Edge
    • Firefox 3.6.9+
    • Opera 10.5+
    • Chrome 4.1+

    支持 X-Frame-Options 的浏览器的 。