Appearance
保证 redirect 参数的安全性 重定向
本节目标:理解“保证 redirect 参数的安全性 重定向”的核心思路,并能把它用于实际开发或面试表达。 保证 redirect 参数的安全性,防止出现「开放重定向漏洞」⚠️。
背景问题
在守卫里,我们常常写: router.push(to.query.redirect || DEFAULT_ROUTE_PATH)
如果没有限制,攻击者就可以构造链接: https://your-site.com/user?redirect=https://evil.com
用户登录后就会被直接跳到 evil.com,这就是典型的 开放重定向漏洞。
** getSafeRedirect **的作用
- 解码并校验
- 尝试
decodeURIComponent,避免双重编码绕过。
- 尝试
- 必须是站内相对路径
- 要求 redirect 必须以
/开头。 - 排除外链(
http://、https://、//开头的路径)。
- 要求 redirect 必须以
- 兜底逻辑
- 如果 redirect 不合法 → 返回
undefined,守卫会回退到首页。
- 如果 redirect 不合法 → 返回
简化理解
- ✅
?redirect=/dashboard/workplace→ 安全,允许。 - ❌
?redirect=https://evil.com→ 被拦截,不跳转。 - ❌
?redirect=//evil.com→ 被拦截,不跳转。 - ❌
?redirect=javascript:alert(1)→ 因为不以/开头,直接拒绝。
👉 也就是说,getSafeRedirect 的存在是为了只允许跳转到你自己系统里的页面,避免用户被利用跳去第三方恶意网站。
