谷歌8.0新版iframe嵌套跨域请求cookie丢失问题

<?php 
// <php7.3版本,cookie设置sameiste参数方法
header('Set-Cookie: cross-site-cookie=bar; SameSite=None; Secure');

// 注意: secure参数
// 1.指示仅应从客户端通过安全的HTTPS连接传输cookie。
//   设置true为时,仅当存在安全连接时(域名必须添加https证书)才设置cookie。
// 2.在Chrome 84版本启动时,没有安全属性secure的cookie也会被拒绝。


// >php7.3版本,cookie设置方法
$arr_cookie_options = array (
    'expires' => time() + 60*60*24*30,
    'path' => '',
    'domain' => '', // leading dot for compatibility or use subdomain
    'secure' => true,     // or false
    'httponly' => false,    // or false
    'samesite' => 'None' // None || Lax  || Strict
);
setcookie('TestCookie', 'The Cookie Value', $arr_cookie_options); 
?>

原因:

浏览器的Cookie新增加了一个SameSite属性,用来防止CSRF攻击和用户追踪。该设置80版本默认是关闭的,但在Chrome 80之后,该功能默认已开启。
不再支持iframe 携带cookie 访问第三方站点

  • 本地解决方法

浏览器设置手动关闭SameSite,在chrome浏览器输入地址:
chrome://flags/#same-site-by-default-cookies
chrome://flags/#cookies-without-same-site-must-be-secure
这两项分别设置为Disabled,并重启浏览器
*此方法只能解决自己浏览器跨域请求问题
  • 服务器解决方法

前提: 配置https证书
cookie设置时,添加samesite参数并设置为None,添加
<?php
    $arr_cookie_options = array (
        'expires' => time() + 60*60*24*60,
        'secure' => true,     // 安全传输
        'samesite' => 'None'  //
    );
?>

tp5获取session id的方式

  • 方法一
*先任一设置一个session值,然后获取session id
session('test,'');
$session_id = session_id();
  • 方法二
*在文件\think\Session 中加一个函数
public static function getSessionId(){
    if (PHP_SESSION_ACTIVE != session_status()) {
        session_start();
    }
    return session_id();
}

获取:Session::getSessionId