【问题标题】:Use URL Query String to Authenticate in PHP在 PHP 中使用 URL 查询字符串进行身份验证
【发布时间】:2013-11-25 09:25:36
【问题描述】:

通常当我设计一个允许用户登录的站点时,我会从数据库中创建用户信息的会话变量,并确保站点的每个页面上至少有一个会话变量可用,否则用户将像这样重定向到登录页面:

if(!isset($_SESSION['username']))
{
  header("Location:login.php");
}

但是我最近一直在想,与其使用会话变量来验证用户,不如使用查询字符串。我的想法是创建一个基于某些因素的唯一字符串,例如date(month, year, day)access time(day, hour)ip address,也许hash 它使用md5,所以网址可能看起来像这样

://mysite.com/dashboard?auth=12jsdnnau819wiskj3jdnck23ksj12j3.

因此,如果用户超过一小时或超过一天未访问该站点,我现在可以轻松注销该用户。但我不知道这是否是一个好主意,这就是为什么我在这里,寻求更好的方法的建议。谢谢大家。

【问题讨论】:

  • 为什么不将访问时间戳存储为会话变量?
  • 为什么不使用会话过期策略?在内部,Web 会话以类似的方式维护 - 通过传递给请求的会话 id 或存储在浏览器中的会话 cookie
  • 不,这不是一个好主意。这与注销用户有什么关系?
  • 这可行,但将这些数据存储在 cookie 中同样容易。而且,通过不使用可变查询字符串使您的 URL 混乱,您将使您的网站对搜索引擎更友好。
  • 另外,session仅限于单个浏览器,一个url可以在不同浏览器和电脑之间扩展session,这是不行的。如果您将身份验证网址发送给朋友,例如通过 Skype,他/她将使用您的帐户登录

标签: php session query-string


【解决方案1】:

因为网址:

  • 容易泄漏
  • 加入书签
  • 当用户打开新标签页并导航回网站时,不要自动转移他们的数据

并且因为没有什么能阻止您在会话中存储相同的数据并使用它轻松注销用户,因此它甚至没有添加您强调的一个好处。

【讨论】:

    【解决方案2】:

    不要这样做。

    您还记得 PHP 会话 ID 可以存储在 URL 中的日子吗,并且您的 URL 看起来像:index.php?PHPSESSID=....

    我们已经从这个转向更安全的实现、用户友好的 URL 等。

    作为可能出错的一个简单示例:网络爬虫可以爬取您的网站,如果使用经过适当身份验证的 URL(如您所述)到达管理面板,它可能会公开提供给……任何人。

    所以...不要重新发明轮子。

    【讨论】:

      【解决方案3】:

      我能想到几个这样做的原因:

      • 散列请求参数公开可见。这意味着使用该 url 的任何人都将被视为经过身份验证的用户。
      • 正如我所见,令牌是每个用户的,因此使用此令牌的所有请求都将代表同一用户完成。如果您共享一个 url,使用该 url 的任何人都将冒充同一用户,并拥有授予该用户的所有访问权限。
      • 其他答案提到网址很容易泄漏或被收藏。除了它们的要点之外,一旦令牌过期,如果您触发登录或其他身份验证重定向机制,则 url 可能会损坏。
      • 您的想法的一个纯技术缺陷也是:在您的应用程序中导航不同页面时,您需要保留令牌

      HTTP 会话旨在服务于此目的,同时足够安全。可以调整应用程序会话长度,使其符合您的要求。我建议您熟悉 HTTP 会话的工作原理以及如何调整会话过期策略,而不是损害应用程序的安全性

      【讨论】:

        猜你喜欢
        • 2019-10-29
        • 1970-01-01
        • 2013-02-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多