在给定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}.");
}
答案 0 :(得分:0)
这是确定本地URL的代码,不足为奇。
但是,有一个旧的说明不支持非ASCII字符,我不确定是否是这种情况,因为我们处于UTF8世界中: https://stackoverflow.com/a/12643655/141022
我无法想象ASP.net核心不支持非ASCI:https://stackoverflow.com/a/22357686/141022
我还建议说Manoj是什么,这很可能是该URL具有空格字符或其他东西(其中有很多UTF-8隐藏字符),也许没有在您的记录器中记录过。