为何登录跳转中把window.location.href设为sessionStorage值存在DOM XSS漏洞?
DOM XSS漏洞分析与修复(Fortify检测CWE-80问题)
一、为什么这段代码存在DOM XSS漏洞?
结合你的业务场景,漏洞核心在于未对sessionStorage中的returnUrl做任何校验就直接赋值给window.location.href:
- 攻击者可以构造恶意链接(比如
javascript:alert('XSS')),诱导未登录用户点击; - 用户点击后,应用会把这个恶意的
window.location.href存入sessionStorage的returnUrl字段; - 用户完成登录跳转到logged-in.html后,代码直接将returnUrl赋值给window.location.href,此时浏览器会执行
javascript:伪协议后的脚本,触发DOM XSS攻击。
这种场景属于DOM型XSS(CWE-80),攻击payload完全通过客户端DOM操作执行,不需要经过服务端处理。
二、漏洞修复方案
核心思路是严格校验returnUrl的合法性,只允许安全的跳转目标,具体实现如下:
1. 校验规则
- 仅允许跳转至同域名的合法路径,或业务允许的可信外部域名;
- 拒绝
javascript:、data:等危险伪协议; - 对非法或解析失败的URL,直接跳转到默认路径。
修复后的代码示例
const returnUrl = sessionStorage.getItem('returnUrl') || '/'; // 验证并处理跳转URL try { // 以当前应用origin为基准解析URL,兼容相对路径 const targetUrl = new URL(returnUrl, window.location.origin); // 仅允许同域名跳转(若业务需要跳转外部域名,可添加可信域名白名单) if (targetUrl.origin !== window.location.origin) { window.location.href = '/'; } else { window.location.href = targetUrl.href; } } catch (error) { // 解析失败时直接跳转默认路径,避免非法URL执行 window.location.href = '/'; }
额外优化建议
- 存储returnUrl时就提前做校验,而非等到跳转阶段才处理;
- 避免直接将用户可控的原始URL存入sessionStorage,必要时可对合法路径进行编码存储,取出后解码校验。
内容的提问来源于stack exchange,提问作者Jesús López
相关产品推荐
相关产品推荐

