ASP.. NET MVC的Url.IsLocalUrl()功能不正确

本文关键字:功能 不正确 IsLocalUrl Url NET MVC ASP | 更新日期: 2023-09-27 18:01:39

我最近窥探了Url.IsLocalUrl()方法的实现,该方法被广泛使用并推荐作为防止重定向攻击的措施之一。如果我在应用程序中为控制器的一个动作提供一个完整的url,我惊讶地发现这个方法返回false。

例如,如果我的应用程序托管在http://localhost:422上,并且如果我要指定一个有效的控制器和操作名称(如http://localhost:422/home/index),则会得到false。看了它的实现之后,我明白了其中的原因。但是,实现不是一开始就不正确吗?

我应该实现自己的IsLocalUrl()吗?还是继续用现在的?

ASP.. NET MVC的Url.IsLocalUrl()功能不正确

如果您查看了文章《防止开放重定向攻击》,您将看到Url.IsLocalUrl()和ReturnUrl=的预期用途是重定向到同一站点上的内部页面/资源,通常是在登录之后。

示例表明,它希望您使用相对或部分url进行内部重定向,而不是完全限定的url。

最好的做法是这样写代码:

//  http://localhost:422/?ReturnUrl=/home/index
// returnUrl == "/home/index"
if( Url.IsLocalUrl(returnUrl) )
{

…而不是:

//  http://localhost:422/?ReturnUrl=http%3A%2F%2Flocalhost%3A422%2Fhome%2Findex
// returnUrl == "http://localhost:422/home/index"
if( Url.IsLocalUrl(returnUrl) )
{

如果您只在同一站点上使用重定向(在大多数非位的应用程序上为安全起见建议使用重定向)。(Ly类型的网站),那么你应该能够做到。

使用现有的url . islocalurl(),但传递部分url重定向。

根据同源策略,主机和端口必须相同。

在实践中,你会看到所有的现代web浏览器将处理2个url与相同的主机,但不同的端口作为不同的网站,无论是读取cookie或执行脚本。

所以看起来Url.IsLocalUrl()的实现是正确的。

Update:这个答案现在不适用了,因为问题已经更新到,所以两个url有相同的主机和端口号