术语表

什么是开放重定向(open redirect):把用户从受信任的 URL 转发到别的站点的漏洞

开放重定向是一种可以经由你网站的 URL 把用户转发到任意外部站点的漏洞。受信任的域名会被用来让钓鱼链接看起来更可信。本文用图解说明其原理,并从防御视角讲解主要的防御(把重定向目标做成允许列表、不接收外部 URL)。

发布于 2026-06-10 更新于 2026-10-06 3 分钟阅读
本页目录

开放重定向是指以你的真域名开头的 URL,会把访问者转到完全不同的站点。下面讲解其原理和可靠的防御方法(不会写攻击步骤)。

为什么危险

危险的本质在于「对域名的信任被滥用」这一点。

被滥用的方式会发生什么
借你的域名做钓鱼链接开头是真域名→用户和过滤器都信任→被诱导到假站点
认证流程被劫持篡改 OAuth 等的重定向目标,盯上 token/code 的传递
放大其他漏洞与 SSRF 或 XSS 组合,扩大危害

为什么会成立(原理)

在「登录后回到原来的页面」之类的功能里,如果原样信任并转发返回地址 URL,就会发生。用户看到的 URL 的「开头」是真域名,所以很难一直怀疑到最后,这正是麻烦之处。

真域名/login?next=(开头是可信的)
next= 里被塞进外部 URL
↓ 网站不校验跳转目标就转发
用户以为「点的是真站点」却到了假站点=钓鱼成立
因为开头是真域名所以被信任。可是若把跳转目标参数里的外部 URL 原样转发出去,攻击者就能把它用于钓鱼。

防御:不接收外部 URL

1

跳转目标只允许相对路径(最重要)

返回地址只接受 /dashboard 这样的相对路径,拒绝完整 URL(以 http://、// 开头的)。不给用户留下任何能指定跳转目标域名的余地。

2

对照允许列表校验

如果需要动态的跳转目标,就只对已知跳转目标的固定集合(映射表)放行。不匹配就回到默认页面。

3

不要依赖字符串判断

//evil、反斜杠、@、多重编码等绕过手法很多。改变接收方式的设计(相对路径+允许列表)比一条条往过滤器里追加规则更可靠。

4

实在要跳到外部就明确告知

如果跳到外部是规格需要,就插入一个确认页面,向用户显示「即将跳转到外部站点」。不要悄无声息地跳走。

本站的视角:单独看评级为「低」,但和钓鱼组合就很严重

开放重定向单独看时往往被认为严重度低,但因为攻击者可以借用你域名的信任,一旦和钓鱼或认证劫持组合起来,就会变得很严重。正因如此,用「相对路径+允许列表」这种设计层面的修复来消除原因才高效。它和 SSRF(让服务器去访问任意目标)的思路相似,二者共同的防御原则都是「不让用户来决定跳转目标・连接目标」。

开放重定向、SSRF 与钓鱼的区别

开放重定向本身与其说是攻击,不如说是一种「让其他攻击更可信」的缺陷。把它和相关术语并列,就能看清它的位置。

术语会发生什么由谁修复
开放重定向真站点的 URL 把用户的浏览器转发到外部站点拥有重定向功能的网站开发者
SSRF不是浏览器,而是服务器向被指定的目标发送请求拥有 URL 获取功能的网站开发者
Phishing(网络钓鱼)用假站点诱导人输入 ID、密码或银行卡信息用户、邮件接收方,以及被冒充的组织

当钓鱼链接能用上真域名时,用户和邮件过滤器都更难识破。消除开放重定向,就能防止自己的域名被用于诈骗。

实例:影响最大的是登录集成(OAuth)

开放重定向影响最大的地方是登录集成(OAuth)周边。授权完成后,用户会带着授权码或 token 被送回已登记的重定向 URI。如果返回的网站存在开放重定向,授权码或 token 就可能被继续送到外部站点。

因此,OAuth 2.0 安全最佳当前实践(RFC 9700,2025 年 1 月)要求以下两点。

  • 授权服务器以完全一致的方式,把重定向 URI 与预先登记的值进行比对
  • 客户端和授权服务器都不提供「按查询参数中的 URL 转发到任意地址」的页面

开放重定向被归类为 CWE-601。单独看时很少被评为高严重度,但一旦挨着登录集成,就会成为严重问题。

严重程度

单独来看,开放重定向通常被评为中等。常见的评分是 CVSS 3.1 6.1。

  • 需要用户打开链接(UI:R)
  • 影响是把用户送到别的站点,不能让人直接读取网站的数据
  • 由于影响超出了进行重定向的网站本身,因此按范围变更(S:C)计分

不要因为分数而拖延。如果它位于登录集成的返回路径上,或者已经被用于钓鱼,就优先修复。要为自己的情况评分,可以使用 CVSS 计算器。

框架已有的安全辅助功能

框架的功能比自己写的字符串检查更不容易漏掉情况。两个常见的例子:

框架辅助功能作用
Ruby on Railsredirect_to 的默认行为和 url_from默认阻止重定向到其他主机;要把用户送到站外,必须显式指定 allow_other_host: true。url_from 只在 URL 属于同一主机时返回该 URL,否则返回 nil
ASP.NET CoreLocalRedirect 和 Url.IsLocalUrl只重定向到同一站点内的 URL,遇到外部 URL 会抛出异常

Rails 文档提醒,即使使用 allow_other_host: true,把用户提供的参数直接传进去也是不安全的。添加站外重定向功能时,要避免这种组合。

检查自己网站的方法

1

找出接收跳转目标的参数

在代码和 URL 列表中搜索名为 next、url、redirect、return_to、continue、callback 等的参数,确认它们是否被原样交给了重定向处理。

2

确认跳转目标的校验方式

看校验是否依赖前缀字符串匹配或「是否以 http 开头」。应改为用 URL 解析器把 URL 拆成协议、主机和端口后再对照允许列表,或者使用框架提供的安全辅助函数(例如 ASP.NET Core 的 LocalRedirect)。

3

检查登录集成的登记内容

在 OAuth 或 SSO 的设置中,确认已登记的重定向 URI 里没有通配符,也没有已不再需要的旧 URL。

4

考虑用 ID 来选择跳转目标

如果必须跳到外部,就不要接收 URL 本身,而是接收一个短 ID,再在服务器端的对照表里查出跳转目标。OWASP 推荐这种做法。

5

在访问日志中查找站外重定向

在访问日志中搜索跳转目标参数里含有自己以外主机名的请求。如果找到,就确认该重定向是否真的把人送到了站外,并把它当作有人可能在散布这类链接的迹象。

参考资料(一手来源)

  • OWASP, "Unvalidated Redirects and Forwards Cheat Sheet" — cheatsheetseries.owasp.org(在服务器端映射 ID、对解析后的 URL 做允许列表校验、警告页面)
  • IETF RFC 9700, "Best Current Practice for OAuth 2.0 Security"(2025 年 1 月)— datatracker.ietf.org(重定向 URI 的完全一致比对、禁止开放重定向器)
  • Ruby on Rails API, "ActionController::Redirecting" — api.rubyonrails.org(默认防止重定向到其他主机、allow_other_host、url_from)
  • Microsoft, "Prevent open redirect attacks in ASP.NET Core" — learn.microsoft.com(LocalRedirect、IsLocalUrl、记录非本地 URL)
  • MITRE, "CWE-601: URL Redirection to Untrusted Site ('Open Redirect')" — cwe.mitre.org

接下来读

分类编号

CWE 对导致漏洞的弱点类型进行分类,MITRE ATT&CK 对攻击者的技术进行分类。两者均由 MITRE 维护,广泛用于标注漏洞信息和检测规则。

CWE™: Copyright © 2006–2026, The MITRE Corporation. CWE is a trademark of The MITRE Corporation. The MITRE Corporation hereby grants you a non-exclusive, royalty-free license to use CWE for research, development, and commercial purposes. Any copy you make for such purposes is authorized on the condition that you reproduce MITRE’s copyright designation and this license in any such copy. CWE Terms of Use

FAQ

Q开放重定向到底有什么问题?
A

因为 URL 的「最前面的域名」是可信的真站点(例如登录页),所以用户和邮件过滤器都会放心地点击。可是网站会把用户转发到任意外部站点,于是真域名可能被用来让钓鱼链接显得可信,或在认证流程中窃取 token。

Q最有效的防御是什么?
A

就是「跳转目标不接收外部 URL」。登录后的返回地址等,不要用完整 URL,只允许相对路径(如 /dashboard),并对照允许列表(已知跳转目标的固定集合)进行校验。如果实在要跳到外部,就插入一个确认页面明确告知用户。

Q只检查是不是 http 就够了吗?
A

不够。还有许多绕过手法,比如以 // 开头的省略形式(//evil.example)、反斜杠、编码、用 @ 构造的迷惑性 URL 等。与其判断字符串,不如从设计上根本就不接收外部 URL(相对路径+允许列表)来得可靠。

Q用简单的话说,开放重定向是什么?
A

你打开的是某个网站的链接,这个网站却把你直接转到 URL 里写着的另一个网站。原因是决定跳转目标的部分(例如 ?next=)可以被外部随意改写。

QOAuth 等登录集成中的重定向 URI 应该怎么设置?
A

把重定向 URI(授权后用户返回的地址)与预先登记的值做完全一致的比对。OAuth 2.0 安全最佳当前实践(RFC 9700,2025 年 1 月)要求按字符串完全匹配,并规定客户端和授权服务器都不得提供把浏览器转发到任意 URL 的页面(开放重定向器)。避免使用通配符或前缀匹配的登记方式。

Q作为用户,怎样才能识别?
A

不要只看链接开头的域名,而要看页面打开后地址栏里的域名。被要求输入密码或银行卡信息时,先确认地址栏中的域名是真站点再输入。拿不准时,不要点邮件里的链接,而是从书签或官方应用打开。

Q开放重定向有多严重?CVSS 评分是多少?
A

单独来看,通常评为中等,因为需要用户打开链接,且影响仅限于把用户送到别的站点。常见的评分是 CVSS 3.1 6.1(AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N)。但如果它位于登录集成(OAuth)的返回路径上,就可能泄露授权码或 token,实际影响会大得多。

Q重定向(redirect)和转发(forward)有什么区别?
A

重定向是服务器告诉浏览器去另一个 URL,由浏览器自己打开。转发是服务器在内部把请求交给另一个处理程序,浏览器的 URL 不会改变。OWASP 两者都有讨论:重定向的问题是把用户送到外部站点;转发的问题是绕过访问控制检查,进入本不应能访问的管理功能。

Q安全评估指出了开放重定向,首先该做什么?
A

不要只封堵被指出的那一个参数。把所有以同样方式接收跳转目标的地方都列出来。然后写一个只接受相对路径的公共函数,让所有重定向都经过它。只在确实需要外部跳转的地方使用允许列表或确认页面。