Google XSS游戏Set-Cookie无法设置Cookie问题排查与修复求助
问题原因
1. Cookie属性不符合浏览器安全策略
现代浏览器对Cookie的设置有严格的安全限制,最常见的是以下两点:
- Secure属性缺失:如果游戏网站使用HTTPS协议,接口返回的
Set-Cookie头没有添加Secure标记,浏览器会拒绝在HTTPS环境下存储非安全的Cookie。 - SameSite属性限制:默认情况下浏览器采用
SameSite=Lax策略,而通过脚本(XHR)发起的请求如果是POST类型,或者触发时机在alert弹窗之后(页面上下文被临时中断),未显式指定SameSite=None; Secure的Cookie会被浏览器拦截,不进行存储。
2. 请求上下文被中断
当你触发alert弹窗后,JavaScript执行流程会被阻塞,直到你点击确定。如果levelSolved函数的XHR请求是在alert之后异步发送的,响应返回时页面的执行上下文可能已经发生变化,导致浏览器没有正确处理Set-Cookie头。
3. Cookie路径/域名配置错误
如果接口返回的Set-Cookie头中指定的Domain或Path与当前页面不匹配(比如Domain设为appspot.com而非xss-game.appspot.com,Path设为/record而非/),浏览器会拒绝存储该Cookie,因为它不属于当前页面的作用域。
修复方案
1. 手动设置Cookie(快速绕过)
打开浏览器开发者工具(F12)→ 切换到Application面板 → 左侧选择Cookies → 点击当前游戏域名,手动添加Cookie:
- 名称:参考接口返回的
Set-Cookie头(比如level_solved) - 值:对应关卡的编号(比如通关第一关就设为
1) - Domain:设为
xss-game.appspot.com - Path:设为
/ - 勾选Secure(因为网站是HTTPS)
设置完成后刷新页面即可正常通关。
2. 修改游戏的通关请求逻辑
通过开发者工具的Console面板修改页面JavaScript代码,调整levelSolved函数的请求方式:
- 给XHR请求添加
withCredentials: true(强制开启凭证携带) - 将异步请求改为同步请求(确保响应处理完成后再继续执行):
function levelSolved(level) { var xhr = new XMLHttpRequest(); xhr.open('POST', '/record', false); // 第三个参数设为false,同步请求 xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); xhr.withCredentials = true; xhr.send('level=' + level); }
重新触发alert即可让浏览器正确处理Set-Cookie。
3. 接口端修复(如果有权限)
修改/record接口的Set-Cookie响应头,添加必要的安全属性:
Set-Cookie: level_solved=1; Domain=xss-game.appspot.com; Path=/; Secure; SameSite=None
这样浏览器就能正常存储Cookie,无需手动干预。
内容的提问来源于stack exchange,提问作者hypercodeplace
相关产品推荐
相关产品推荐

