请求的UrlReferrer为什么会为空?

24
在一个 aspx C#.NET 页面(我正在运行框架 v3.5),我需要知道用户来自哪里,因为他们没有登录就无法查看页面。如果我有页面 A(用户想要查看的页面)重定向到页面 B(登录页面),那么 Request.UrlReferrer 对象将为 null。
背景:如果用户没有登录,我会重定向到登录页(在此场景中为 B)。登录后,我希望将他们返回到之前被强制登录之前请求的页面。
更新: 一个简单快速的解决方案似乎是: //如果用户未登录 Response.Redirect("..MyLoginPage.aspx?returnUrl=" + Request.ServerVariables["SCRIPT_NAME"]); 然后,在您强制他们登录的登录页面上查看 QueryString,并在成功登录后将用户放回原来的位置。
4个回答

30

UrlReferrer基于浏览器应该发送的HTTP_REFERER头部信息。但是,像所有客户端控制的事物一样,它是可变的。

我知道一些“安全”套件(如诺顿互联网安全套件)会剥离该头部信息,认为这有助于跟踪用户行为。此外,我相信也有一些Firefox扩展可以做同样的事情。

底线是你不应该相信它。只需将url附加到GET字符串并根据其进行重定向。

更新:正如评论中提到的那样,将重定向从GET参数限制为仅对无域相对链接起作用的好主意,拒绝目录模式(../)等。因此,仍要对重定向进行合理性检查;如果遵循标准的“不要盲目使用任何用户提供的输入”规则,您就会安全。


2
这是一个不好的主意,因为有人可以发布像这样的链接:http://somedomain.com/login?returnUrl=http://myshadylink.com - Daniel Lorenz
2
@DanielLorenz - 绝对是一个合理的担忧,但是可以通过拒绝包含域名的returnUrl值来轻松解决这个问题。 - Micah
UrlHelper.IsLocalUrl在默认的MVC模板中用于防止开放式重定向。我相信这是在MVC2之后添加的。顺便说一下 - 使用UrlReferrer也有同样的问题,因为它也是由客户端提供的。 - Mark Brackett

11

如果您使用标准会员身份提供程序,并为目录/页面设置授权,则代码将自动设置ReturnUrl的查询参数并在成功登录后重定向。

如果您不想使用会员身份提供程序模式,我建议手动执行查询字符串参数操作。HTTP引用者不太可靠。


2
问题可能与您如何将用户重定向到其他页面有关。无论如何,引用者URL不是您应该作为绝对规则的内容 - 客户端可以轻松伪造它。

2
你需要做的最好用查询字符串变量来完成(例如returnURL或originURL)。引荐者最好用于数据挖掘操作,因为它非常不可靠。
看看ASP.Net如何使用登录重定向作为示例。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接