目前,我们正在存储用户的 HTTP_REFERER,以便我们可以将用户重定向回他们登录之前浏览的上一个页面。
Http Referer 来自客户端,可以是欺骗性的,也可以是空白的。是否有更安全/可靠的方法来提供这种方便的用户重定向?
以某种方式运行
history.go(-1);
是我能想到的唯一选择(javascript)
你有会议吗?
如果是这样,您可以在服务器端跟踪他们在此会话中访问了哪些页面,并将它们发送回上一个页面。
(缓存可能会搞砸,但您可以适当地设置 cache-control: 标头)
但这一切似乎是痛苦多于收获。将它们发送回欺骗页面是否有任何真正的问题,如果它们足够愚蠢的话?
保罗。
通常我通过登录表单传递它。
<form action="login" method="post">
<input type="hidden" name="url" value="... whatever the current url is ...">
<input type="text" name="username">
<input type="text" name="password">
</form>
从来没听说过。但是,您是否认为普通用户会假装他们的Referer只是为了被重定向到错误的地方?这看起来不太可能。
我担心需要将用户重定向到他们来自哪里,甚至不需要询问他们。我要么有一个偏好选项来决定是否允许它(以及在哪里),要么事先询问他们重定向,能够拒绝重定向。
如果 RoBorg 假设您将在与您自己的站点不同的站点上提供登录屏幕并且您想要存储源站点,那么您当然可以使用相同的表单来发送他们登录的站点。
尽管我猜您需要检查 XSRF,但引用者可能对大多数用户都可以正常工作。我们所做的是,当有人点击他们必须登录的区域时,他们会被重定向到登录页面,其中包含他们在会话中存储位置的 URL。
一旦他们登录,他们就会被重定向到以前的 URL。
当然,这在很大程度上取决于您的身份验证是如何设置的!
我实际上有一个函数,它使用几种不同的方法进行重定向,具体取决于用户进入登录页面所采用的路径。
我在用户登录后调用的函数如下所示:
Protected Sub doRedirect(ByVal sender As Object, ByVal e As System.EventArgs)
If Not Request.QueryString("rtn") Is Nothing Then
Response.Redirect(Request.QueryString("rtn").ToString)
ElseIf Me.hidden_return.Value <> "" Then
Response.Redirect(Me.hidden_return.Value)
ElseIf Not Request.UrlReferrer Is Nothing AndAlso Request.UrlReferrer.Segments(Request.UrlReferrer.Segments.Length - 1) <> "login.aspx" Then
Response.Redirect(Request.UrlReferrer.ToString)
Else
Response.Redirect("default.aspx")
End If
End Sub
显然,这一切都可以在客户端进行欺骗,但我真的不在乎他们是否想欺骗自己。