经验分享 | 一次cookie SameSite爬坑之旅

1,228 阅读2分钟

引言

  • 事件起源
  • 技术方案
  • 浏览器cookie问题
  • ios端safari浏览器问题
  • 微信网页授权问题
  • 最终技术实现

1、需求起源于业务希望我司平台提供一个js sdk包供第3方授权使用

细节:

  • 调起时需要弹框调起(说是体验好)
  • 需要支持手机浏览器和微信浏览器
  • 领导呢说要快快弄完
  • 心里mmp

2、沟通确认技术方案

  • 1、前端js直接调用后台接口(不安全,容易暴露接口被刷,其次获取不到用户是否登录过,每次都需要填写手机号登录) ×
  • 2、参考Facebook js登录sdk,调起一个iframe,iframe里嵌套php页面,来处理授权以及登录逻辑(需要iframe与页面通信)
  • 3、最终选择了方案2

3、iframe打开3方链接cookie写入失效问题

主要原因: 通俗一点就是chrome升级了,会默认cookie加一个SameSite=Lax的属性(为了防止减少CSRF攻击)

SameSite支持的3个值

  • Strict
  • Lax
  • None
请求类型示例正常情况Lax
链接可以可以
预加载可以可以
GET 表单可以可以
POST 表单可以不可以
iframe可以不可以
AJAX$.get("...")可以不可以
Image可以不可以

解决方案:php7.3以后setcookie支持设置SameSite的值,但是很可以我们是7.2,版本不会轻易的升级, 只能自己复写cookie方法

简易通过header头设置

  function setnewcookie($name, $value, $options){
    $expire = isset($options['expires']) ? $options['expires'] : 0;
    $path = isset($options['path']) ? $options['path'] : '';
    $domain = isset($options['domain']) ? $options['domain'] : '';
    $secure = isset($options['secure']) ? boolval($options['secure']) : false;
    $httponly = isset($options['httponly']) ? boolval($options['httponly']) : false;
    $samesite = isset($options['samesite']) ? $options['samesite'] : '';

    $expire = 0 < $expire ? (int) $expire : 0;
    $date = gmdate('D, d-M-Y H:i:s T',$expire);
    $maxAge = ($expire-time()>0)?$expire-time():0;
    $path = empty($path) ? '/' : $path;
    $cookie = sprintf("Set-Cookie:%s=%s;expires=%s; Max-Age=%d;path=%s;domain=%s;secure=%d;HttpOnly=%d;SameSite=%s", urlencode($name),urlencode($value), $date,$maxAge,$path, $domain, $secure, $httponly, $samesite);
    //dump($cookie);exit;
    header($cookie);
}

github找到一个封装好的类

  https://github.com/ovunctukenmez/SameSiteCookieSetter

iframe 访问cookie写入问题解决

4、ios端自带浏览器的坑

  • 在上一个cookie的坑搞定后,又出现新的问题,ios端 safari突然说cookie也写入不了,用户只能在登录页
  • 上网搜索了很多资料,是苹果的幺蛾子(mmp)
  • 解决方案:在老一点的版本,如果第3方先有任意cookie的情况下,才可以写入(估计是漏洞),最新版本已不支持这种方式,除非关闭safarir浏览器设置的阻止跨网站跟踪
  • 和老板好一顿说,表示臣妾做不了后可以忽略

5、微信网页授权问题

  • 一个问题后边总会跟着另外一个。微信网页授权也出现问题
  • 安卓中不可以加载iframe,直接就是白屏
  • ios端直接就跳页面了
  • 只能找领导沟通
  • 相关文章 微信网页授权iframe打不开问题

6、最终解决方案

全部走浏览器的授权

7、可能会有用的方案

如果ios发现不能写cookie的话,可以先试试在第3方写入一个cookie之后

结尾

通过这次爬坑之路,学习到了不少了新知识,开发之路且珍惜