Impedisci attacchi di reindirizzamento aperti in ASP.NET CorePrevent open redirect attacks in ASP.NET Core

Un'app Web che reindirizza a un URL specificato tramite la richiesta, ad esempio la QueryString o i dati del modulo, può essere potenzialmente manomessa per reindirizzare gli utenti a un URL esterno e dannoso.A web app that redirects to a URL that's specified via the request such as the querystring or form data can potentially be tampered with to redirect users to an external, malicious URL. Questa manomissione è detta attacco di reindirizzamento aperto.This tampering is called an open redirection attack.

Ogni volta che la logica dell'applicazione reindirizza a un URL specificato, è necessario verificare che l'URL di reindirizzamento non sia stato alterato.Whenever your application logic redirects to a specified URL, you must verify that the redirection URL hasn't been tampered with. ASP.NET Core dispone di funzionalità predefinite che consentono di proteggere le app da attacchi di reindirizzamento aperti (noti anche come reindirizzamento aperti).ASP.NET Core has built-in functionality to help protect apps from open redirect (also known as open redirection) attacks.

Che cos'è un attacco di reindirizzamento aperto?What is an open redirect attack?

Le applicazioni Web indirizzano spesso gli utenti a una pagina di accesso quando accedono alle risorse che richiedono l'autenticazione.Web applications frequently redirect users to a login page when they access resources that require authentication. Il reindirizzamento include in genere un returnUrl parametro QueryString, in modo che l'utente possa essere restituito all'URL richiesto in origine dopo che l'accesso è stato eseguito correttamente.The redirection typically includes a returnUrl querystring parameter so that the user can be returned to the originally requested URL after they have successfully logged in. Dopo l'autenticazione, l'utente viene reindirizzato all'URL richiesto originariamente.After the user authenticates, they're redirected to the URL they had originally requested.

Poiché l'URL di destinazione è specificato nella stringa QueryString della richiesta, un utente malintenzionato potrebbe manomettere la QueryString.Because the destination URL is specified in the querystring of the request, a malicious user could tamper with the querystring. Una QueryString manomessa potrebbe consentire al sito di reindirizzare l'utente a un sito esterno e dannoso.A tampered querystring could allow the site to redirect the user to an external, malicious site. Questa tecnica è detta attacco di reindirizzamento (o reindirizzamento) aperto.This technique is called an open redirect (or redirection) attack.

Un attacco di esempioAn example attack

Un utente malintenzionato può sviluppare un attacco progettato per consentire all'utente malintenzionato di accedere alle credenziali di un utente o alle informazioni riservate.A malicious user can develop an attack intended to allow the malicious user access to a user's credentials or sensitive information. Per iniziare l'attacco, l'utente malintenzionato convince l'utente a fare clic su un collegamento alla pagina di accesso del returnUrl sito con un valore QueryString aggiunto all'URL.To begin the attack, the malicious user convinces the user to click a link to your site's login page with a returnUrl querystring value added to the URL. Si consideri ad esempio un' contoso.com app in che include una pagina http://contoso.com/Account/LogOn?returnUrl=/Home/Aboutdi accesso all'indirizzo.For example, consider an app at contoso.com that includes a login page at http://contoso.com/Account/LogOn?returnUrl=/Home/About. L'attacco segue questa procedura:The attack follows these steps:

  1. L'utente fa clic su http://contoso.com/Account/LogOn?returnUrl=http://contoso1.com/Account/LogOn un collegamento dannoso (il secondo URL è "Contoso1. com", non "contoso.com").The user clicks a malicious link to http://contoso.com/Account/LogOn?returnUrl=http://contoso1.com/Account/LogOn (the second URL is "contoso1.com", not "contoso.com").
  2. L'utente ha eseguito l'accesso.The user logs in successfully.
  3. L'utente viene reindirizzato (dal sito) http://contoso1.com/Account/LogOn a (un sito dannoso simile al sito reale).The user is redirected (by the site) to http://contoso1.com/Account/LogOn (a malicious site that looks exactly like real site).
  4. L'utente accede nuovamente (assegnando loro le credenziali al sito dannoso) e viene reindirizzato di nuovo al sito reale.The user logs in again (giving malicious site their credentials) and is redirected back to the real site.

È probabile che l'utente ritenga che il primo tentativo di accesso non sia riuscito e che il secondo tentativo abbia avuto esito positivo.The user likely believes that their first attempt to log in failed and that their second attempt is successful. L'utente probabilmente rimane inconsapevole del fatto che le relative credenziali sono compromesse.The user most likely remains unaware that their credentials are compromised.

Processo di attacco di reindirizzamento aperto

Oltre alle pagine di accesso, alcuni siti forniscono pagine di reindirizzamento o endpoint.In addition to login pages, some sites provide redirect pages or endpoints. Si supponga che l'app abbia una pagina con un reindirizzamento /Home/Redirectaperto,.Imagine your app has a page with an open redirect, /Home/Redirect. Un utente malintenzionato potrebbe creare, ad esempio, un collegamento in un messaggio di [yoursite]/Home/Redirect?url=http://phishingsite.com/Home/Loginposta elettronica che passa a.An attacker could create, for example, a link in an email that goes to [yoursite]/Home/Redirect?url=http://phishingsite.com/Home/Login. Un utente tipico osserverà l'URL e vedrà che inizia con il nome del sito.A typical user will look at the URL and see it begins with your site name. Considerato attendibile, i colleghi faranno clic sul collegamento.Trusting that, they will click the link. Il reindirizzamento aperto invierà quindi l'utente al sito di phishing, che sembra identico a quello dell'utente e l'utente potrebbe accedere a quello che ritiene sia il sito.The open redirect would then send the user to the phishing site, which looks identical to yours, and the user would likely login to what they believe is your site.

Protezione da attacchi di reindirizzamento apertiProtecting against open redirect attacks

Quando si sviluppano applicazioni Web, considerare tutti i dati forniti dall'utente come non attendibili.When developing web applications, treat all user-provided data as untrustworthy. Se l'applicazione dispone di funzionalità che reindirizza l'utente in base al contenuto dell'URL, assicurarsi che i reindirizzamenti vengano eseguiti solo localmente all'interno dell'app (o a un URL noto, non a qualsiasi URL che può essere fornito nella querystring).If your application has functionality that redirects the user based on the contents of the URL, ensure that such redirects are only done locally within your app (or to a known URL, not any URL that may be supplied in the querystring).

LocalRedirectLocalRedirect

Usare il LocalRedirect metodo helper della classe di base Controller :Use the LocalRedirect helper method from the base Controller class:

public IActionResult SomeAction(string redirectUrl)
{
    return LocalRedirect(redirectUrl);
}

LocalRedirectgenererà un'eccezione se viene specificato un URL non locale.LocalRedirect will throw an exception if a non-local URL is specified. In caso contrario, si comporta esattamente come il Redirect metodo.Otherwise, it behaves just like the Redirect method.

IsLocalUrlIsLocalUrl

Usare il metodo IsLocalUrl per verificare gli URL prima del reindirizzamento:Use the IsLocalUrl method to test URLs before redirecting:

Nell'esempio seguente viene illustrato come controllare se un URL è locale prima del reindirizzamento.The following example shows how to check whether a URL is local before redirecting.

private IActionResult RedirectToLocal(string returnUrl)
{
    if (Url.IsLocalUrl(returnUrl))
    {
        return Redirect(returnUrl);
    }
    else
    {
        return RedirectToAction(nameof(HomeController.Index), "Home");
    }
}

Il IsLocalUrl metodo protegge gli utenti dal reindirizzamento inavvertitamente a un sito dannoso.The IsLocalUrl method protects users from being inadvertently redirected to a malicious site. È possibile registrare i dettagli dell'URL fornito quando viene specificato un URL non locale in una situazione in cui è previsto un URL locale.You can log the details of the URL that was provided when a non-local URL is supplied in a situation where you expected a local URL. Gli URL di reindirizzamento della registrazione possono essere utili per la diagnosi degli attacchi di reindirizzamento.Logging redirect URLs may help in diagnosing redirection attacks.