我的持久登录方法是否安全?

时间:2011-03-11 23:52:41

标签: php

我非常坚持使用合理的安全方法在登录系统中实现“记住我”功能。到目前为止,这是我的方法,如果有意义并且相当安全,请告诉我:

日志记录:

  1. 用户提供登录时的电子邮件和密码(两者都有效)..通过比较提供的电子邮件从数据库表用户获取user_id

  2. 生成2个随机数字哈希字符串:key1,key2并存储在cookie中。在DB Table COOKIES中,将key1,key2与user_id一起存储。

  3. 要检查登录信息:

    1. 如果key1和key2都存在,请验证DB Table COOKIES中的两个键(如果存在key1和key2的行,则记录用户)。

    2. 如果cookie有效,请重新生成key2并在cookie和数据库中更新它。

    3. 为什么重新生成密钥: 因为如果有人窃取cookie并使用该cookie登录,它将仅在真实用户登录之前有效。当真实用户登录时,被盗的cookie将变为无效。正确?

      为什么我需要2个键: 因为如果我在cookie和数据库中存储user_id和单个密钥,并且用户想要记住另一个浏览器或计算机上的密码,那么新密钥将在数据库中更新,因此早期浏览器/ PC中的用户cookie将变为无效。用户无法在多个地方记住密码。

      感谢您的意见。

4 个答案:

答案 0 :(得分:2)

考虑一下:添加第二个cookie如何让那些可以窃取任意cookie的用户更难以以该用户身份登录?

没有。你必须把它绑在用户可以提供的东西上,但它不可能是一回事。如果你可以将它绑定到IP地址,那很好。如果不是,请考虑使用第一个密钥作为HMAC或其他东西来散列用户代理+用户ID。我仍然在尝试自己设计一个安全的登录系统,所以我可以告诉你什么肯定不起作用 - 这就是其中之一。

答案 1 :(得分:1)

杰伊 - 这和昨天一样:

PHP login security

答案仍然是相同的,也就是说SSL是确保人们无法嗅到纯文本cookie的唯一方法。如果您判断您愿意接受cookie可能被截获的风险,那么您的方法很好(但比必要的更复杂)。

假设您已经完成了SSL并不是您要使用的方法,我不确定您认为只有一个Cookie就可以提供两个单独的Cookie。

答案 2 :(得分:1)

您的计划是基于cookie偷窃偏执狂。实际上只有三种方法可以窃取cookie:

  1. 中间人攻击。
  2. 跨网站脚本或类似漏洞,允许任意代码在您网站的安全上下文中运行。
  3. 使用浏览器对计算机进行物理访问。
  4. 我们还会将恶意软件归类为实物用途。

    让我们不要担心身体安全。如果用户失去了对他的机器的控制权,他将会遇到更多问题,而不是担心你的网站!

    让我们也不要担心XSS,盲目地假设你已经尽力阻止它。

    这会导致MITM攻击。

    您可以针对MITM攻击获得的最佳(读取:)保护之一是SSL。如果您真的担心MITM,那么您应该通过SSL为整个网站提供服务。

    您不需要两个自己的Cookie。您只需要会话cookie和记住我的cookie,顺便说一下,您可以简单地存储在多对一表中。这可以防止用户和Remember Mes之间强制一对一的关系。

答案 3 :(得分:0)

不要绑定到IP地址。这将使您的网站对于坐在NAT后面的任何人群(或在很多情况下aol)都没用。

当一个cookie是接收另一个cookie的先决条件时,多个cookie才真正有用。

如果网站需要登录,则可以生成并分配安全会话cookie,然后在后续页面加载时重新生成(对于不保持相同会话状态标识符的站点,不可能执行会话固定)通过会议)。

如果网站现在提示用户完成某种结帐流程,您可能希望将第二个Cookie实现为以某种方式链接到第一个Cookie的安全令牌。这两种cookie都成为通过网站进行交易的先决条件,使其难以固定。

最后,您可能希望在$ _SESSION超级全局中进行此链接。如果您的网站有任何合理的流量,那么在数据库中执行此操作可能会非常昂贵。这意味着每次需要操作或启动或停止用户会话时,都需要数据库连接和任意数量的查询/删除/插入/更新。这不可扩展。