美文网首页
【Django】谷歌浏览器新版本Chrome 80默认SameS

【Django】谷歌浏览器新版本Chrome 80默认SameS

作者: 爱折腾的程序猿 | 来源:发表于2020-07-24 11:58 被阅读0次

    一、 问题描述

    但是Django后台发送给chrome浏览器的response header中set-session中默认加上了
    SameSite=Lax。这个属性禁止第三方请求携带cookie,导致chrom浏览器request请求不能携带
    cookie。当时在Django setting.py中添加以下设置,禁用chrom中的SamSite属性或者说Django 返
    回的response header中set-session中SameSite=None
    

    二、SamSite解释

    Cookie 的SameSite属性用来限制第三方 Cookie,从而减少安全风险。
    它可以设置三个值:Strict、Lax、None
    
    2.1、Strict解释
    Strict最为严格,完全禁止第三方 Cookie,跨站点时,任何情况下都不会发送 Cookie。换言之,
    只有当前网页的 URL 与请求目标一致,才会带上 Cookie。
    Set-Cookie: CookieName=CookieValue; SameSite=Strict;
    这个规则过于严格,可能造成非常不好的用户体验。比如,当前网页有一个 GitHub 链接,用户点
    击跳转就不会带有 GitHub 的 Cookie,跳转过去总是未登陆状态。
    
    2.2、Lax解释
    Lax规则稍稍放宽,大多数情况也是不发送第三方 Cookie,但是导航到目标网址的 Get 请求除外。
    Set-Cookie: CookieName=CookieValue; SameSite=Lax;
    设置了Strict或Lax以后,基本就杜绝了 CSRF 攻击。当然,前提是用户浏览器支持 SameSite 属性。
    
    2.3、None解释
    Chrome 计划将Lax变为默认设置。这时,网站可以选择显式关闭SameSite属性,将其设为
    None。不过,前提是必须同时设置Secure属性(Cookie 只能通过 HTTPS 协议发送),否则无效。
    下面的设置无效。
    Set-Cookie: widget_session=abc123; SameSite=None
    下面的设置有效。
    Set-Cookie: widget_session=abc123; SameSite=None; Secure
    

    三、解决方案

    假设读者已经解决了前后端跨域和CSRF问题,如果没有请参考博主的另一篇文章:https://www.jianshu.com/p/b61f2cdef9d7

    该方案现测试适用于django版本 > 2.1.0

    #settings.py
    #COOKIE_SAMESITE:简单跨域解决SAMESIT问题
    SESSION_COOKIE_SAMESITE = None
    #CSRF_COOKIE_SAMESITE:CSRF跨域解决SAMESITE问题
    CSRF_COOKIE_SAMESITE = None
    

    相关文章

      网友评论

          本文标题:【Django】谷歌浏览器新版本Chrome 80默认SameS

          本文链接:https://www.haomeiwen.com/subject/lzrjlktx.html