Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Веб-приложение, которое перенаправляется по URL-адресу, указанному через запрос, например данные строки запросов или формы, могут быть изменены для перенаправления пользователей на внешний, вредоносный URL-адрес. Это манипуляция называется атакой открытого перенаправления.
Всякий раз, когда логика приложения перенаправляется на указанный URL-адрес, необходимо убедиться, что URL-адрес перенаправления не был изменен. ASP.NET Core имеет встроенные функции для защиты приложений от атак открытого перенаправления (также известных как открытые перенаправления).
Что такое атака открытого перенаправления?
Веб-приложения часто перенаправляют пользователей на страницу входа при доступе к ресурсам, которым требуется проверка подлинности. Перенаправление обычно включает returnUrl параметр запроса, чтобы пользователь смог вернуться к исходно запрошенному URL-адресу после успешного входа. После проверки подлинности пользователя он перенаправляется по URL-адресу, который он первоначально запрашивал.
Так как целевой URL-адрес указан в запросе, злоумышленник может изменить строку запроса. Измененная строка запроса может позволить сайту перенаправлять пользователя на внешний вредоносный сайт. Этот метод называется атакой с открытым перенаправлением (или перенаправления).
Пример атаки
Злоумышленник может разработать атаку, предназначенную для предоставления злоумышленнику доступа к учетным данным пользователя или конфиденциальной информации. Чтобы начать атаку, злоумышленник убеждает пользователя щелкнуть ссылку на страницу входа сайта со значением returnUrl запроса, добавленным в URL-адрес. Например, рассмотрим приложение на contoso.com, в котором есть страница входа на http://contoso.com/Account/LogOn?returnUrl=/Home/About. Атака выполняет следующие действия:
- Пользователь щелкает вредоносную ссылку
http://contoso.com/Account/LogOn?returnUrl=http://contoso1.com/Account/LogOn(второй URL-адрес — contoso1.com, а не "contoso.com"). - Пользователь успешно входит в систему.
- Пользователь перенаправляется (сайтом)
http://contoso1.com/Account/LogOnна (вредоносный сайт, который выглядит точно так же, как реальный сайт). - Пользователь снова входит в систему (предоставляя свои учетные данные вредоносному сайту) и перенаправляется обратно на реальный сайт.
Пользователь, скорее всего, считает, что первая попытка войти в систему завершилась неудачно, и что их вторая попытка выполнена успешно. Пользователь, скорее всего, не знает, что их учетные данные скомпрометируются.
Помимо страниц входа некоторые сайты предоставляют страницы перенаправления или конечные точки. Представьте, что приложение имеет страницу с открытым перенаправлением. /Home/Redirect Кибератака может создать, например, ссылку в сообщении электронной почты, на которую идет ссылка [yoursite]/Home/Redirect?url=http://phishingsite.com/Home/Login. Типичный пользователь будет просматривать URL-адрес и видеть его начало с вашего имени сайта. Доверяя тому, они щелкнут ссылку. После этого открытое перенаправление отправит пользователя на фишинговый сайт, который выглядит идентично вашему, и пользователь, скорее всего, войдет в то, что они считают вашим сайтом.
Защита от атак посредством открытых перенаправлений
При разработке веб-приложений следует рассматривать все предоставленные пользователем данные как ненадежные. Если приложение имеет функциональные возможности, которые перенаправляют пользователя на основе содержимого URL-адреса, убедитесь, что такие перенаправления выполняются только локально в приложении (или на известный URL-адрес, а не любой URL-адрес, который может быть предоставлен в запросе).
Локальное перенаправление
Используйте вспомогательный LocalRedirect метод из базового Controller класса:
public IActionResult SomeAction(string redirectUrl)
{
return LocalRedirect(redirectUrl);
}
LocalRedirect вызовет исключение, если указан не локальный URL-адрес. В противном случае он ведет себя так же, как Redirect метод.
IUrlHelper.IsLocalUrl
IsLocalUrl Используйте метод для проверки URL-адресов перед перенаправлением:
В следующем примере показано, как проверить, является ли URL-адрес локальным перед перенаправлением.
private IActionResult RedirectToLocal(string returnUrl)
{
if (Url.IsLocalUrl(returnUrl))
{
return Redirect(returnUrl);
}
else
{
return RedirectToAction(nameof(HomeController.Index), "Home");
}
}
Метод IUrlHelper.IsLocalUrl защищает пользователей от непреднамеренного перенаправления на вредоносный сайт. Вы можете записать сведения о URL-адресе, предоставленном при указании не локального URL-адреса в ситуации, когда вы ожидали локальный URL-адрес. Ведение журнала адресов перенаправления может помочь в диагностике атак перенаправления.
Определение локального URL-адреса с помощью RedirectHttpResult.IsLocalUrl
Вспомогательный RedirectHttpResult.IsLocalUrl(url) метод определяет, является ли URL-адрес локальным. URL-адрес считается локальным, если выполняются следующие условия:
- В нём отсутствуют раздел хост или авторизация.
- Он имеет абсолютный путь.
URL-адреса с виртуальными путями "~/" также являются локальными.
IsLocalUrl полезно для проверки URL-адресов перед перенаправлением на них, чтобы предотвратить атаки открытого перенаправления.
if (RedirectHttpResult.IsLocalUrl(url))
{
return Results.LocalRedirect(url);
}
ASP.NET Core