跨域通过隐藏img标签设置Cookie后跳转目标站点Cookie未生效问题
问题成因
- 浏览器第三方Cookie拦截限制:在a.com站点下嵌入b.com的资源请求属于第三方上下文请求,Chrome、Edge、Firefox等主流浏览器均默认阻止第三方站点在该场景下写入Cookie;直接访问b.com地址属于第一方上下文,不受该限制,因此可以正常写入Cookie。
- SetCookie参数不符合跨站Cookie规范:你当前的setcookie代码存在两处问题:一是路径参数使用了中文双引号,存在语法错误;二是未显式设置
SameSite属性和Secure属性,当前浏览器默认会将未声明SameSite的Cookie按SameSite=Lax处理,跨站场景下不允许写入。
解决方案
- 调整Cookie写入参数,修正语法并补充跨站要求属性:
将b.com站点下的cookie.php代码修改为如下形式,设置SameSite=None的同时必须开启Secure属性,且b.com需要使用HTTPS协议访问才能生效:
<?php // 注意所有符号均为英文半角符号,SameSite=None必须搭配Secure使用 header('Set-Cookie: age_gate=1; Max-Age=3600; Path=/; Domain=www.b.com; Secure; HttpOnly; SameSite=None'); ?>
- 兼容全场景的替代方案:如果需要兼容用户禁用第三方Cookie的场景,可放弃img埋点方案,改用跳转中继逻辑:将a.com的跳转按钮先指向b.com的cookie.php,cookie.php完成Cookie写入后,再通过302重定向跳转到b.com的目标页面,该方案属于第一方上下文写入Cookie,不会被浏览器拦截,兼容性更强。
内容的提问来源于stack exchange,提问作者SirSeba
相关产品推荐
相关产品推荐

