【问题标题】:Request.UrlReferrer null?Request.UrlReferrer 为空?
【发布时间】:2010-09-14 00:42:51
【问题描述】:

在一个 aspx C#.NET 页面(我正在运行框架 v3.5)中,我需要知道用户来自哪里,因为他们无法在不登录的情况下查看页面。如果我有页面 A(用户的页面想要查看)重定向到页面B(登录页面),Request.UrlReferrer对象为空。

背景:如果用户没有登录,我会重定向到登录页面(在这种情况下为B)。登录后,我想将他们返回到他们被强制登录之前请求的页面。

更新:
一个不错的快速解决方案似乎是:
//if user not logged in Response.Redirect("..MyLoginPage.aspx?returnUrl=" + Request.ServerVariables["SCRIPT_NAME"]);
然后,只需查看登录页面上的 QueryString,您强制他们进入并在成功登录后将用户放在他们所在的位置。

【问题讨论】:

    标签: c# .net visual-studio visual-studio-2008


    【解决方案1】:

    UrlReferrer 基于浏览器应该发送的HTTP_REFERER 标头。但是,与留给客户的所有事情一样,它是可变的。

    我知道一些“安全”套件(如 Norton 的 Internet Security)会去除该标头,相信它有助于跟踪用户行为。另外,我确信有一些 Firefox 扩展可以做同样的事情。

    底线是你不应该相信它。只需将 url 附加到 GET 字符串并以此为基础进行重定向。

    更新:如 cmets 中所述,将来自 GET 参数的重定向限制为仅适用于无域相对链接、拒绝目录模式 (../) 等可能是个好主意。所以仍然是健全性检查重定向;如果您遵循标准“不要盲目使用任何用户提供的输入”规则,您应该是安全的。

    【讨论】:

    • 这是个坏主意,因为有人可能会发布这样的链接:somedomain.com/login?returnUrl=http://myshadylink.com
    • @DanielLorenz - 绝对是一个合理的问题,但这可以通过拒绝包含域的 returnUrl 值来轻松解决。
    • UrlHelper.IsLocalUrl 在默认 MVC 模板中用于防止这种开放重定向。我相信这是在 MVC2 之后的某个时间添加的。 FWIW - 使用 UrlReferrer 也有同样的问题,因为它也是客户端提供的。
    【解决方案2】:

    如果你使用标准的Membership provider,并且为目录/页面设置了Authorization,代码会自动设置ReturnUrl的查询参数,并在登录成功后重定向。

    如果您不想使用会员提供程序模式,我建议您也手动执行查询字符串参数。 HTTP 引荐来源网址不是很可靠。

    【讨论】:

      【解决方案3】:

      问题可能与您如何将用户重定向到其他页面有关。无论如何,引用 url 不是你应该将其视为绝对规则的东西 - 客户可以轻松伪造它。

      【讨论】:

        【解决方案4】:

        您要查找的内容最好使用查询字符串变量(例如 returnURL 或 originURL)来完成。 Referrer 最适合用于数据挖掘操​​作,因为它非常不可靠。

        查看 ASP.Net 使用登录进行重定向的方式作为示例。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-01-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-06-14
          • 1970-01-01
          • 2014-08-06
          相关资源
          最近更新 更多