• 部分浏览器 set-cookie 不成功踩坑记录


    事件起因:

    公司正在做一个sso的单点登录的项目,做完之后,在测试阶段,不同的终端的兼容测试时候,好几个不同的浏览器出现了不同的问题,有登录之后自动退出,有登陆不成功等问题。

    在 pc 端只有 uc 浏览器不成功,移动端有 safari、360浏览器、qq浏览器、uc浏览器等。

    结果排查:

    后面具体查询,发现是由于后端在请求响应头设置 set-cookie 来处理 cookie 数据没有生效。由于数据没有正常写入 cookie 中,导致了上面各浏览器登录不成功的问题。

    问题解决:

    而最终引发问题的原因是 set-cookie 中的 samesite 的兼容性引起的。

    http://www.ruanyifeng.com/blog/2019/09/cookie-samesite.html  阮一峰老师对于 samesite 的介绍。

    samesite 的出现是为了解决 CSRF 攻击和用户追踪。

    后面又查到了这篇文章:https://devblogs.microsoft.com/aspnet/upcoming-samesite-cookie-changes-in-asp-net-and-asp-net-core/

    上面详细介绍了 samesite 的前世今生及经测试过非规范的浏览器兼容列表以及处理方案:

    public static bool DisallowsSameSiteNone(string userAgent)
    {
        if (string.IsNullOrEmpty(userAgent))
        {
            return false;
        }
    
        // Cover all iOS based browsers here. This includes:
        // - Safari on iOS 12 for iPhone, iPod Touch, iPad
        // - WkWebview on iOS 12 for iPhone, iPod Touch, iPad
        // - Chrome on iOS 12 for iPhone, iPod Touch, iPad
        // All of which are broken by SameSite=None, because they use the iOS networking stack
        if (userAgent.Contains("CPU iPhone OS 12") || userAgent.Contains("iPad; CPU OS 12"))
        {
            return true;
        }
    
        // Cover Mac OS X based browsers that use the Mac OS networking stack. This includes:
        // - Safari on Mac OS X.
        // This does not include:
        // - Chrome on Mac OS X
        // Because they do not use the Mac OS networking stack.
        if (userAgent.Contains("Macintosh; Intel Mac OS X 10_14") && 
            userAgent.Contains("Version/") && userAgent.Contains("Safari"))
        {
            return true;
        }
    
        // Cover Chrome 50-69, because some versions are broken by SameSite=None, 
        // and none in this range require it.
        // Note: this covers some pre-Chromium Edge versions, 
        // but pre-Chromium Edge does not require SameSite=None.
        if (userAgent.Contains("Chrome/5") || userAgent.Contains("Chrome/6"))
        {
            return true;
        }
    
        return false;
    }

    处理方法:

    if (options.SameSite == SameSiteMode.None) {
      var userAgent = httpContext.Request.Headers["User-Agent"].ToString();
      // TODO: Use your User Agent library of choice here.
      if (DisallowsSameSiteNone(userAgent)) { 
       // For .NET Core < 3.1 set SameSite = (SameSiteMode)(-1)
       options.SameSite = SameSiteMode.Unspecified;
     }
    }

    在不能识别 samesite 新值的,浏览器版本中,set-cookie 中的 samesite 值设为 -1,在前端请求头中,将发现 set-cookie 的值中已没有了samesite 配置。

    UC浏览器截图:

     chrome浏览器截图:

  • 相关阅读:
    docker 安装 mysql5.7
    docker 安装 redis
    docker 安装 gitlab
    docker 升级到新版本
    logstash 采集springboot 错误日志配置
    图片左下角添加水印
    frida动态修改
    反反frida调试
    IDA插件KeyPatch直接在IDA中修改arm指令
    frida调用制作dex(用于有些对象读取不了)
  • 原文地址:https://www.cnblogs.com/kdcg/p/13403181.html
Copyright © 2020-2023  润新知