Обнаружение и предотвращение атак с открытым перенаправлением (open redirect attacks)¶
Атаки с открытым перенаправлением происходят,когда следующая страница передаётся в качестве параметра методу действия, например, при входе в приложение. Обычно приложения запоминают страницу, прежде чем перенаправить пользователя на страницу входа, и передают ее странице входа в качестве параметра, например, returnUrl. После выполнения входа пользователь возвращается на страницу, где он остановился.
Атака с открытым перенаправлением использует этот шаблон. Злоумышленник создаёт URL-адрес для страницы входа, где в returnUrl задана ссылка на вредоносный сайт. После выполнения входа пользователь попадает на этот вредоносный сайт.
Простой способ решить эту проблему — проверять, что returnUrl является локальным URL-адресом, до перенаправления пользователя на этот адрес. (Если используется система Identity, пользовательский интерфейс делает это по умолчанию).
ASP.NET Core предоставляет несколько вспомогательных методов для обеспечения безопасности, самым полезным из которых является Url.IsLocalUrl(), который проверяет, является ли адрес локальным. Также можно использовать вспомогательный метод Localredirect() классов ControllerBase и PageModel, который возбуждает исключение, если переданный адрес не является локальным.
[HttpPost]
public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = null)
{
//Проверяем пароль и даём пользователю выполнить вход
if(Url.IsLocalUrl(returnUrl))
{
return Redirect(returnUrl);
}
else
{
return RedirectToAction("Index", "Home"); //Если адрес не локальный, перенаправим на домашнюю страницу.
}
}
Дата создания : 24 октября 2022 г.