Url.IsLocalUrl产生具有相同值的不同结果吗?

时间:2019-01-22 21:11:23

标签: c# .net asp.net-mvc url-redirection

在给定returnUrl值相同的情况下,调用Url.IsLocalUrl(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 :(得分:0)

这是确定本地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隐藏字符),也许没有在您的记录器中记录过。