【问题标题】:ASP.NET MVC Isn't functionality of Url.IsLocalUrl() incorrect?ASP.NET MVC Url.IsLocalUrl() 的功能不正确吗?
【发布时间】:2015-09-27 05:45:14
【问题描述】:

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

例如,如果我的应用程序托管在http://localhost:422,并且如果我要指定一个有效的控制器和操作名称,例如http://localhost:422/home/index,我将得到错误。在查看了它的实现之后,我明白了为什么。但是一开始的实现不是不正确吗?

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

【问题讨论】:

    标签: c# asp.net-mvc asp.net-mvc-4


    【解决方案1】:

    如果您查看文章 Preventing Open Redirection Attacks ,您会看到 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) )
    {
    

    如果您只在同一个站点上使用重定向(在大多数非 bit.ly 类型站点的应用程序上建议安全),那么您应该能够做到。

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

    【讨论】:

      【解决方案2】:

      根据Same Origin Policyhost and port have to be the same

      在实践中,您会看到所有现代网络浏览器都会将具有相同主机和不同端口的 2 个 url 视为不同的站点,无论是读取 cookie 还是执行脚本。

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

      更新:此答案现在不适用,因为问题已更新为使 2 个 url 具有相同的主机和端口号。

      【讨论】:

      • 我很抱歉在上面的示例中列出了不同的端口号。那是我的一个错字。
      猜你喜欢
      • 2013-10-25
      • 1970-01-01
      • 2016-04-15
      • 2011-03-02
      • 1970-01-01
      • 2011-12-28
      • 1970-01-01
      • 1970-01-01
      • 2021-01-25
      相关资源
      最近更新 更多