Предотвращение атак открытого перенаправления в ASP.NET CorePrevent open redirect attacks in ASP.NET Core

Если веб-приложение перенаправляет пользователя на URL-адрес, указанный по запросу, например в строке запроса или через данные формы, этот URL-адрес может быть подделан и вести на внешний вредоносный сайт.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. Такое изменение данных называется атакой открытого перенаправления.This tampering is called an open redirection attack.

Каждый раз, когда логика вашего приложения выполняет перенаправление на определенный URL-адрес, нужно убедиться, что этот адрес не был изменен.Whenever your application logic redirects to a specified URL, you must verify that the redirection URL hasn't been tampered with. ASP.NET Core содержит встроенные функциональные возможности, помогающие защитить приложения от атак методом открытого перенаправления/переадресации.ASP.NET Core has built-in functionality to help protect apps from open redirect (also known as open redirection) attacks.

Что такое атака открытого перенаправленияWhat is an open redirect attack?

Веб-приложения часто перенаправляют пользователей на страницу входа при доступе к ресурсам, требующим проверки подлинности.Web applications frequently redirect users to a login page when they access resources that require authentication. Перенаправление обычно включает параметр строки запроса returnUrl, чтобы после успешной проверки подлинности пользователь был перенаправлен на первоначально запрошенный URL-адрес.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. После проверки подлинности пользователя, он будет перенаправлен на URL-адрес, который запрошен изначально.After the user authenticates, they're redirected to the URL they had originally requested.

Поскольку конечный URL-адрес указан в строке запроса, злоумышленник может незаконно изменить ее.Because the destination URL is specified in the querystring of the request, a malicious user could tamper with the querystring. Измененный запрос позволит сайту перенаправить пользователя на внешний вредоносный сайт.A tampered querystring could allow the site to redirect the user to an external, malicious site. Этот прием называется атакой открытого перенаправления.This technique is called an open redirect (or redirection) attack.

Пример атакиAn example attack

Злоумышленник может разработать атаку, которая позволит ему получить доступ к учетным или конфиденциальным данным пользователя.A malicious user can develop an attack intended to allow the malicious user access to a user's credentials or sensitive information. Чтобы начать атаку, злоумышленник убеждает пользователя щелкнуть ссылку на страницу авторизации вашего сайта, добавляя в URL-адрес значение строки запроса returnUrl.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. Например, рассмотрим приложение на сайте contoso.com со страницей входа http://contoso.com/Account/LogOn?returnUrl=/Home/About.For example, consider an app at contoso.com that includes a login page at http://contoso.com/Account/LogOn?returnUrl=/Home/About. Атака включает следующие шаги:The attack follows these steps:

  1. Пользователь нажмет на http://contoso.com/Account/LogOn?returnUrl=http://contoso1.com/Account/LogOn (второй URL-адрес является «contoso1.com», не «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. Пользователь успешно вошел.The user logs in successfully.
  3. Сайт перенаправляет пользователя на http://contoso1.com/Account/LogOn (вредоносный сайт, который выглядит как настоящий).The user is redirected (by the site) to http://contoso1.com/Account/LogOn (a malicious site that looks exactly like real site).
  4. Пользователь пытается войти еще раз (предоставляя вредоносному сайту свои учетные данные) и перенаправляется на настоящий сайт.The user logs in again (giving malicious site their credentials) and is redirected back to the real site.

Пользователь скорее всего думает, что ему просто не удалось войти с первой попытки, и не подозревает,The user likely believes that their first attempt to log in failed and that their second attempt is successful. что его учетные данные скомпрометированы.The user most likely remains unaware that their credentials are compromised.

Процесс атаки открытого перенаправления

Помимо страниц для входа, некоторые сайты предоставляют страницы перенаправления или конечные точки.In addition to login pages, some sites provide redirect pages or endpoints. Предположим, у вашего приложения есть страница с открытым перенаправлением /Home/Redirect.Imagine your app has a page with an open redirect, /Home/Redirect. Злоумышленник может создать, например, ссылку в электронном письме, которая ведет на [yoursite]/Home/Redirect?url=http://phishingsite.com/Home/Login.An attacker could create, for example, a link in an email that goes to [yoursite]/Home/Redirect?url=http://phishingsite.com/Home/Login. Обычного пользователя будет проверять URL-адрес и увидеть, что он начинается с имени веб-сайта.A typical user will look at the URL and see it begins with your site name. Увидев, что этот URL-адрес начинается с названия вашего веб-сайта, обычный пользователь, ни о чем не подозревая, щелкнет ссылку.Trusting that, they will click the link. Открытое перенаправление затем переведет его на фишинговый сайт, который выглядит в точности как ваш, и пользователь, скорее всего, введет на нем свои учетные данные.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.

Защита от открытого перенаправленияProtecting against open redirect attacks

При разработке веб-приложений следует считать все предоставляемые пользователями данные не заслуживающими доверия.When developing web applications, treat all user-provided data as untrustworthy. Если приложение содержит функции, перенаправляющие пользователя на основе содержимого URL-адреса, перенаправление должно осуществляться только локально внутри приложения (или строго на известный URL, а не на любой адрес в строке запроса).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

Используйте LocalRedirect вспомогательный метод из базового Controller класса:Use the LocalRedirect helper method from the base Controller class:

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

LocalRedirect вызовет исключение, если указан URL-адрес, не являющейся локальным.LocalRedirect will throw an exception if a non-local URL is specified. В противном случае он ведет себя так же, как метод Redirect.Otherwise, it behaves just like the Redirect method.

IsLocalUrlIsLocalUrl

Используйте IsLocalUrl метод для проверки перед перенаправлением URL-адреса:Use the IsLocalUrl method to test URLs before redirecting:

В следующем примере показано, как проверить, является ли URL-адрес локальным, перед перенаправлением.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");
    }
}

Метод IsLocalUrl защищает пользователей от случайного перенаправления на вредоносный сайт.The IsLocalUrl method protects users from being inadvertently redirected to a malicious site. Рекомендуем фиксировать сведения об URL-адресе в ситуациях, когда вместо ожидаемого локального URL предоставляется нелокальный.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. Это поможет в диагностике использующих перенаправление атак.Logging redirect URLs may help in diagnosing redirection attacks.