Url.IsLocalUrl выдаёт разные результаты с одинаковым значением? - PullRequest
0 голосов
/ 23 января 2019

Похоже, что вызов Url.IsLocalUrl (returnUrl) дает разные результаты, учитывая то, что кажется одинаковым значением для returnUrl.Как это возможно?

Структура таргетинга приложений MVC 4.7.1.В попытке предотвратить атаки с открытым перенаправлением, у меня есть код ниже.Довольно просто и универсально.

Когда я пытаюсь перейти на нашу целевую страницу без входа в систему, и меня перенаправляют обратно на страницу входа, мой URL-адрес: https://ourdomain.com/I/Login?ReturnUrl=%2fI%2fHome. Когда я вхожу,URL, по которому я нахожу себя: https://ourdomain.com/I/Home. Отлично.Как и ожидалось.Это работает для 99,9 +% наших пользователей, в противном случае нас бы затопили ошибки, а мы нет.

Однако у нас есть хотя бы один пользователь, который получает ошибку здесь.В наших журналах ошибок говорится: «Обнаружена атака открытого перенаправления. Пользователь собирался войти в систему, а затем был возвращен:% 2fI% 2fHome.»

Мой рабочий returnUrl и тот, что в наших журналах ошибок, совпадают, и это работает 99,9 +% времени для того же значения.Я не могу воспроизвести ошибку самостоятельно.Почему в редких случаях это приводит к другим результатам?Заранее спасибо за любые предложения!

if (!string.IsNullOrWhiteSpace(returnUrl) && !Url.IsLocalUrl(returnUrl))
{
    throw new Exception($"An open redirection attack was detected.  User was going to login and then be returned to: {returnUrl}.");
}

1 Ответ

0 голосов
/ 23 января 2019

Вот код, используемый для определения локального URL, ничего удивительного.

https://github.com/aspnet/AspNetCore/blob/321327f84b2b22dcff2e9beb06a9a64236c5cced/src/Mvc/src/Microsoft.AspNetCore.Mvc.Core/Routing/UrlHelperBase.cs#L44

Однако есть старое утверждение, что не ASCII-символы не поддерживаются, я не уверен, что это так, поскольку мы находимся в мире UTF8: https://stackoverflow.com/a/12643655/141022

Я не могу представить, что ядро ​​ASP.net не поддерживает не-ASCI: https://stackoverflow.com/a/22357686/141022

Я бы также предложил, что такое Manoj, это, вероятно, правда, что URL имеет символ пробела или что-то еще (есть много скрытых символов UTF-8), которые, возможно, не регистрируются в вашем логгере.

...