You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何登录跳转中把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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 10:15:34