名詞解釋

什麼是開放重新導向(open redirect):把使用者從你受信任的 URL 轉到別的站點的漏洞

開放重新導向是可經由你網站的 URL 把使用者轉到任意外部站點的漏洞,常被用來讓網路釣魚連結看起來可信。圖解原理,並說明主要防禦:重新導向目標用允許清單、不接收外部 URL。

發布於 2026-06-10 更新於 2026-10-06 閱讀時間 3 分鐘
本頁內容

開放重新導向是指以你的真網域開頭的 URL,卻把訪客送到完全不同的站點。下面講解其原理和可靠的防禦方法(不會寫攻擊步驟)。

為什麼危險

危險的本質在於「對網域的信任被濫用」這一點。

被濫用的方式會發生什麼
經由你的網域進行 phishing連結開頭是真網域→使用者和過濾器都信任→被誘導到假站點
認證流程被劫持竄改 OAuth 等的重新導向目標,盯上 token/code 的傳遞
放大其他漏洞與 SSRF 或 XSS 組合,擴大危害

為什麼會成立(原理)

在「登入後回到原來的頁面」之類的功能裡,如果原樣信任並轉發返回位址 URL,就會發生。使用者看到的 URL 的「開頭」是真網域,所以很難一直懷疑到最後,這正是麻煩之處。

真網域/login?next=(開頭是可信的)
next= 裡被塞進外部 URL
↓ 網站不校驗跳轉目標就轉發
使用者以為「點的是真站點」卻到了假站點=phishing 成立
因為開頭是真網域所以被信任。可是若把跳轉目標參數裡的外部 URL 原樣轉發出去,攻擊者就能用它來做 phishing。

防禦:不接收外部 URL

1

跳轉目標只允許相對路徑(最重要)

返回位址只接受 /dashboard 這樣的相對路徑,拒絕完整 URL(以 http://、// 開頭的)。不給使用者留下任何能指定跳轉目標網域的餘地。

2

對照允許清單校驗

如果需要動態的跳轉目標,就只對已知跳轉目標的固定集合(對應表)放行。不符合就回到預設頁面。

3

不要依賴字串判斷

//evil、反斜線、@、多重編碼等繞過手法很多。改變接收方式的設計(相對路徑+允許清單)比一條條往過濾器裡追加規則更可靠。

4

實在要跳到外部就明確告知

如果跳到外部是規格需要,就插入一個確認頁面,向使用者顯示「即將跳轉到外部站點」。不要悄無聲息地跳走。

本站的視角:單獨看評為「低」,但和 phishing 組合就很嚴重

開放重新導向單獨看時往往被認為嚴重度低,但因為攻擊者能借用你網域的信任,一旦和 phishing 或認證劫持組合起來,就會變得很嚴重。正因如此,用「相對路徑+允許清單」這種設計層面的修正來消除原因才高效。它和 SSRF(讓伺服器去存取任意目標)的思路相似,二者共同的防禦原則都是「不讓使用者來決定跳轉目標・連線目標」。

開放重新導向、SSRF 與網路釣魚的比較

開放重新導向本身與其說是攻擊,不如說是讓其他攻擊更有說服力的缺陷。把它與相關用語並列,就能看出它的位置。

用語發生什麼由誰修正
開放重新導向真網站的 URL 把使用者的瀏覽器轉送到外部網站有重新導向功能的網站開發者
SSRF不是瀏覽器,而是伺服器向被指定的目標送出請求有 URL 取得功能的網站開發者
網路釣魚用假網站讓人輸入帳號、密碼或信用卡資料使用者、郵件接收端,以及被冒充的組織

當釣魚連結可以使用真網域時,使用者與郵件過濾器都更難識破。消除開放重新導向,可以避免你的網域被用於詐騙。

實例:影響最大的地方是登入整合(OAuth)

開放重新導向影響最大的地方,是登入整合(OAuth)周邊。授權後,使用者會帶著授權碼或權杖被送回登錄的 redirect URI。如果返回的網站有開放重新導向,授權碼或權杖就可能被轉送到外部網站。

因此 OAuth 2.0 安全最佳實務(RFC 9700,2025 年 1 月)要求兩件事。

  • 授權伺服器以完全比對檢查 redirect 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 設定中,確認已登錄的 redirect URI 不含萬用字元,也沒有留下已不需要的舊 URL。

4

考慮以 ID 指定跳轉目標

如果必須跳到外部,就接收簡短的 ID 而不是 URL 本身,並在伺服器端的對照表中查出跳轉目標。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(redirect 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 的「最前面的網域」是可信的真站點(例如登入頁),所以使用者和郵件過濾器都會放心地點擊。可是網站會把使用者轉發到任意外部站點,於是真網域會被濫用來讓 phishing 連結看起來可信,或在認證流程中竊取 token。

Q最有效的防禦是什麼?
A

就是「跳轉目標不接收外部 URL」。登入後的返回位址等,不要用完整 URL,只允許相對路徑(如 /dashboard),並對照允許清單(已知跳轉目標的固定集合)進行校驗。如果實在要跳到外部,就插入一個確認頁面明確告知使用者。

Q只檢查是不是 http 就夠了嗎?
A

不夠。還有許多繞過手法,比如以 // 開頭的省略形式(//evil.example)、反斜線、編碼、用 @ 構造的迷惑性 URL 等。與其判斷字串,不如從設計上根本就不接收外部 URL(相對路徑+允許清單)來得可靠。

Q用簡單的話說,什麼是開放重新導向?
A

你打開某個網站的連結,那個網站卻把你直接轉送到 URL 裡寫著的另一個網站。之所以會發生,是因為決定跳轉目標的部分(例如 ?next=)可以從外部隨意改寫。

QOAuth 與登入整合的 redirect URI 該怎麼設定?
A

把 redirect URI(授權後使用者返回的位址)與事先登錄的值做完全比對。OAuth 2.0 安全最佳實務(RFC 9700,2025 年 1 月)要求精確的字串比對,並規定用戶端與授權伺服器都不得公開會把瀏覽器轉送到任意 URL 的頁面(開放重新導向器)。請避免以萬用字元或前綴方式登錄。

Q身為使用者,要怎麼分辨?
A

看頁面打開之後的網址列,而不是連結開頭的網域。被要求輸入密碼或信用卡資料時,先確認網址列的網域是真的再輸入。有疑慮時,請從書籤或官方 App 開啟網站,而不是點郵件裡的連結。

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)的返回路徑上,就可能洩漏授權碼或權杖,實際影響會大得多。

Q重新導向(redirect)和轉送(forward)有什麼不同?
A

重新導向是伺服器告訴瀏覽器去另一個 URL,由瀏覽器自己開啟。轉送是伺服器在內部把請求交給另一個處理程序,瀏覽器的 URL 不會改變。OWASP 兩者都有涵蓋:重新導向的問題是把使用者送到外部網站;轉送的問題是繞過存取控制檢查,進入本不該能存取的管理功能。

Q資安檢測指出了開放重新導向,第一步該做什麼?
A

不要只擋下被指出的那一個參數。列出所有以相同方式接收跳轉目標的地方。接著寫一個只接受相對路徑的共用函式,讓所有重新導向都經過它。只有在真的需要外部跳轉的地方,才使用允許清單或確認頁面。