问题现象
新版Chrome 80浏览器可能会导致CDN访问失败。
可能原因
新版 Chrome 80 版本默认屏蔽所有第三方 Cookie,即默认为所有 Cookie 加上 SameSite=Lax属性,详情请参见公告。这样可以从源头屏蔽掉大量的 CSRF 漏洞,但由于第三方 Cookie 丢失,可能会导致页面不可访问的问题。
解决方案
排查您网站的页面。
打开SameSite by default cookies和Cookies without SameSite must be secure两个Flag。
分别开启这两个开关。
开启后,您可以提前试验屏蔽第三方 Cookie 的效果。
注意部分浏览器不能加SameSite=none的情况:
IOS 12 的 Safari 以及一些老版本的 Chrome的浏览器 。由于这些浏览器会把 SameSite=none 识别成 SameSite=Strict(比 Lax 还要严格的一种模式),所以服务端必须在下发 Set-Cookie 响应头时进行 User-Agent 检测,对这些浏览器不下发 SameSite=none 属性,详见公告。
仅仅只有跨站的情况。技术人员对跨域更了解,跨站没有跨域那么严格,例如 a.a.com和 b.a.com就是只跨域而不跨站的,也就是说这两个是同一个网站,因此不需要加SameSite=none 属性。
说明 请您不要为所有 Cookie 添加 SameSite=none。 我们建议您更有针对性的为真正的第三方 Cookie 添加 SameSite=none 属性,如果连第一方 Cookie 也加上,网站安全性会和以前一样,没有提升。
本站方法:
1.在helper里添加公用函数获取浏览器和版本号
/**
* 获取浏览器和版本号
* @return mixed
*/
if (!function_exists('getBrowser')) {
function getBrowser()
{
$sys = $_SERVER['HTTP_USER_AGENT'];
if (stripos($sys, "NetCaptor") > 0) {
$exp[0] = "NetCaptor";
$exp[1] = "";
} elseif (stripos($sys, "Firefox/") > 0) {
preg_match("/Firefox\/([^;)]+)+/i", $sys, $b);
$exp[0] = "Mozilla Firefox";
$exp[1] = $b[1];
} elseif (stripos($sys, "MAXTHON") > 0) {
preg_match("/MAXTHON\s+([^;)]+)+/i", $sys, $b);
preg_match("/MSIE\s+([^;)]+)+/i", $sys, $ie);
// $exp = $b[0]." (IE".$ie[1].")";
$exp[0] = $b[0] . " (IE" . $ie[1] . ")";
$exp[1] = $ie[1];
} elseif (stripos($sys, "MSIE") > 0) {
preg_match("/MSIE\s+([^;)]+)+/i", $sys, $ie);
//$exp = "Internet Explorer ".$ie[1];
$exp[0] = "Internet Explorer";
$exp[1] = $ie[1];
} elseif (stripos($sys, "Netscape") > 0) {
$exp[0] = "Netscape";
$exp[1] = "";
} elseif (stripos($sys, "Opera") > 0) {
$exp[0] = "Opera";
$exp[1] = "";
} elseif (stripos($sys, "Chrome") > 0) {
preg_match("/Chrome\/([^;)]+)+/i", $sys, $b);
$exp[0] = "Chrome";
$exp[1] = current(explode('.', $b[1]));
} else {
$exp = "未知浏览器";
$exp[1] = "";
}
return $exp;
}
}
2.在入口文件,添加cookie
//兼容Chrome 新版80以上 可能导致CDN访问失败 https://help.aliyun.com/knowledge_detail/150891.html
$browser = getBrowser();
if(!empty($browser) && $browser[0] == 'Chrome' && $browser[1] >= 80) setcookie('SameSite','none');