【问题标题】:Is it best to use HTTP REFERER for redirects or use some other method?最好使用 HTTP REFERER 进行重定向还是使用其他方法?
【发布时间】:2008-11-21 16:41:35
【问题描述】:

目前,我们正在存储用户的 HTTP_REFERER,以便我们可以将用户重定向回他们登录之前浏览的上一个页面。

Http Referer 来自客户端,可以是欺骗性的,也可以是空白的。是否有更安全/可靠的方法来提供这种方便的用户重定向?

【问题讨论】:

  • 每当我使用它时,我的心态是,如果有人在欺骗他们的推荐人,那么我真的不在乎他们是否能回到他们来自的地方。我相信 99% 的时间它都是可用的并且是正确的。这 1% 是高级用户,无论如何都会找到回家的路。
  • 我记得那天,突然间,一半的网络被破坏了。原来诺顿(那个混蛋)正在从我的帖子或获取中删除任何推荐。我实在是太生气了……

标签: http redirect


【解决方案1】:

你们有课吗?

如果是这样,您可以在服务器端跟踪他们在此会话中访问了哪些页面并将它们发送回之前的页面。

(缓存可能会搞砸,但您可以适当地设置 cache-control: 标头)

但这一切似乎比收获更痛苦。如果他们傻到这样做,将他们送回欺骗页面有什么真正的问题吗?

保罗。

【讨论】:

    【解决方案2】:

    以某种方式运行

    history.go(-1);
    

    是我能想到的唯一选择(javascript)

    【讨论】:

      【解决方案3】:

      通常我通过登录表单传递它。

      <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>
      

      【讨论】:

      • 你怎么知道是哪一页?哦,您假设登录页面位于不同的站点上。
      • 我有点假设登录框在网站的每个页面上,因此您可以浏览未登录的网站,但从任何页面登录并返回您所在的页面
      • 嗯,看来我们需要更多上下文。我解释说他想将用户送回 google.com
      • 出于安全原因,我不同意在客户端存储信息。如果我将引用者存储在服务器端会话变量中,我可以相信用户无法更改我刚刚设置的值。有了隐藏的字段,所有的赌注都被取消了。
      • 当然可以,但是来自客户端的所有数据在使用前都应该经过验证,以避免反射 xss 漏洞。因此,最好验证插入到脚本中的任何客户端数据并存储在数据服务器端,这样您就知道它不能被操纵。
      【解决方案4】:

      我不知道。但是,您是否认为普通用户会假装他们的 Referer 只是为了被重定向到错误的地方?这看起来不太可能。

      我担心需要在不询问用户的情况下将用户重定向到他们的来源。我要么有一个偏好选项来决定是否允许它(以及在哪里),要么事先询问他们重定向,能够拒绝重定向。

      如果 RoBorg 假设您将在与您自己的网站不同的网站上提供登录屏幕,并且您想要存储源网站,那么您当然可以使用相同的表单来发送他们登录的网站。

      【讨论】:

        【解决方案5】:

        对于大多数用户来说,referer 可能工作得很好,尽管我猜你需要检查 XSRF。我们所做的是,当有人点击他们必须登录的区域时,他们会被重定向到登录页面,其中包含他们在会话中存储位置的 URL。

        一旦他们登录,他们就会被重定向到之前的 URL。

        当然,这在很大程度上取决于您的身份验证是如何设置的!

        【讨论】:

          【解决方案6】:

          我实际上有一个函数,它使用几种不同的方法进行重定向,具体取决于用户进入登录页面所采用的路径。

          我在用户登录后调用的函数如下所示:

          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
          

          显然,这一切都可以在客户端进行欺骗,但我真的不在乎他们是否想欺骗自己。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-04-01
            • 1970-01-01
            • 1970-01-01
            • 2020-03-28
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多