c# - Url.IsLocalUrl 产生具有相同值的不同结果?

标签 c# .net asp.net-mvc redirect

鉴于 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}.");
}

最佳答案

这是确定本地 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 Core 不支持非 ASCI:https://stackoverflow.com/a/22357686/141022

我还建议 Manoj 是什么,这很可能是真的,因为 url 有一个空白字符或其他东西(有很多 UTF-8 隐藏字符)可能没有记录在您的记录器中。

关于c# - Url.IsLocalUrl 产生具有相同值的不同结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54316495/

相关文章:

c# - 如何编写调用方法的事件

c# - DynamoDb 条件插入

c# - 没有安装 Entity Framework 驱动程序的 DMS?

c# - 在格式错误的 xml 中转义属性中的内部引号

c# - 避免在 View 中添加 if/else 逻辑

asp.net-mvc - 如何为 MVC 创建具有一对多关联的假存储库

c# - Unity 2D - OnMouseDown() 不工作

.net - 如何为在列表上执行的一组操作正确地内联 F# 函数?

javascript - 为什么我的 Javascript 函数在加载时运行

c# - 如何判断是否有控制台