Prevence útoků s otevřeným přesměrováním ASP.NET Core
Webovou aplikaci, která přesměruje na adresu URL zadanou prostřednictvím požadavku, jako je řetězec dotazu nebo data formuláře, se může potenciálně manipulovat, aby se přesměroval uživatel na externí škodlivou adresu URL. Tato manipulace se nazývá útok s otevřeným přesměrováním.
Kdykoli logika aplikace přesměruje na zadanou adresu URL, musíte ověřit, že s adresou URL pro přesměrování nebylo manipulováno. ASP.NET Core má integrovanou funkci, která pomáhá chránit aplikace před útoky s otevřeným přesměrováním (označuje se také jako otevřené přesměrování).
Co je útok s otevřeným přesměrováním?
Webové aplikace často přesměrují uživatele na přihlašovací stránku, když přistupují k prostředkům, které vyžadují ověření. Přesměrování obvykle zahrnuje parametr řetězce dotazu, aby se uživatel mohl po úspěšném přihlášení vrátit na původně returnUrl požadovanou adresu URL. Jakmile se uživatel ověří, přesměruje se na adresu URL, o kterou původně požádal.
Vzhledem k tomu, že cílová adresa URL je určená v řetězec dotazu požadavku, může uživatel se zlými úmysly manipulovat s řetězcem dotazu. Zmanipulovaný řetězec dotazu by mohl webu umožnit přesměrování uživatele na externí škodlivý web. Tato technika se nazývá útok s otevřeným přesměrováním (neboli přesměrováním).
Příklad útoku
Uživatel se zlými úmysly může vyvinout útok, který uživateli se zlými úmysly umožní přístup k přihlašovacím údajům nebo citlivým informacím uživatele. K zahájení útoku uživatel se zlými úmysly přesvědčí uživatele, aby klikl na odkaz na přihlašovací stránku vašeho webu s přidanou hodnotou řetězce returnUrl dotazu do adresy URL. Představte si například aplikaci na adrese contoso.com , která obsahuje přihlašovací stránku na adrese http://contoso.com/Account/LogOn?returnUrl=/Home/About . Útok se řídí těmito kroky:
- Uživatel klikne na škodlivý odkaz na (druhá adresa URL je
http://contoso.com/Account/LogOn?returnUrl=http://contoso1.com/Account/LogOn"contoso 1.com", nikoli na "contoso.com"). - Uživatel se úspěšně přihlásí.
- Uživatel je přesměrován (webem) na
http://contoso1.com/Account/LogOn(škodlivý web, který vypadá úplně stejně jako skutečný web). - Uživatel se znovu přihlásí (dá škodlivému webu svoje přihlašovací údaje) a přesměruje se zpět na skutečný web.
Uživatel pravděpodobně věří, že jeho první pokus o přihlášení selhal a že jeho druhý pokus byl úspěšný. Uživatel s největší pravděpodobností neví, že jsou jeho přihlašovací údaje ohrožené.

Kromě přihlašovacích stránek poskytují některé weby také stránky přesměrování nebo koncové body. Imagine aplikace má stránku s otevřeným přesměrováním /Home/Redirect . Útočník by například mohl vytvořit odkaz v e-mailu, který přejde na [yoursite]/Home/Redirect?url=http://phishingsite.com/Home/Login adresu . Typický uživatel se podívá na adresu URL a uvidí, že začíná názvem vašeho webu. S důvěrou v to kliknou na odkaz. Otevřené přesměrování pak odešle uživatele na web phishing, který vypadá stejně jako váš, a uživatel se pravděpodobně přihlásí k tomu, co se domnívá, že je váš web.
Ochrana před útoky s otevřeným přesměrováním
Při vývoji webových aplikací řešte všechna uživatelská data jako nedůvěryhodná. Pokud má vaše aplikace funkci, která přesměruje uživatele na základě obsahu adresy URL, ujistěte se, že se tato přesměrování provádí pouze místně v rámci vaší aplikace (nebo na známou adresu URL, ne na žádnou adresu URL, kterou lze zadat v řetězec dotazu).
LocalRedirect
Použijte LocalRedirect pomocné metody ze základní Controller třídy:
public IActionResult SomeAction(string redirectUrl)
{
return LocalRedirect(redirectUrl);
}
LocalRedirect vyvolá výjimku, pokud je zadána nemístně zadaná adresa URL. V opačném případě se chová stejně jako Redirect metoda .
IsLocalUrl
K otestování adres URL před přesměrováním použijte metodu IsLocalUrl:
Následující příklad ukazuje, jak před přesměrováním zkontrolovat, jestli je adresa URL místní.
private IActionResult RedirectToLocal(string returnUrl)
{
if (Url.IsLocalUrl(returnUrl))
{
return Redirect(returnUrl);
}
else
{
return RedirectToAction(nameof(HomeController.Index), "Home");
}
}
Metoda chrání uživatele před nechtěným přesměrováním na IsLocalUrl škodlivý web. Můžete protokolovat podrobnosti o adrese URL, která byla zadána, když je zadána nemístně zadaná adresa URL v situaci, kdy jste očekávali místní adresu URL. Adresy URL pro přesměrování protokolování můžou pomoct s diagnostikou útoků přesměrování.