我非常坚持使用合理的安全方法在登录系统中实现“记住我”功能。到目前为止,这是我的方法,如果有意义并且相当安全,请告诉我:
日志记录:
用户提供登录时的电子邮件和密码(两者都有效)..通过比较提供的电子邮件从数据库表用户获取user_id
生成2个随机数字哈希字符串:key1,key2并存储在cookie中。在DB Table COOKIES中,将key1,key2与user_id一起存储。
要检查登录信息:
如果key1和key2都存在,请验证DB Table COOKIES中的两个键(如果存在key1和key2的行,则记录用户)。
如果cookie有效,请重新生成key2并在cookie和数据库中更新它。
为什么重新生成密钥: 因为如果有人窃取cookie并使用该cookie登录,它将仅在真实用户登录之前有效。当真实用户登录时,被盗的cookie将变为无效。正确?
为什么我需要2个键: 因为如果我在cookie和数据库中存储user_id和单个密钥,并且用户想要记住另一个浏览器或计算机上的密码,那么新密钥将在数据库中更新,因此早期浏览器/ PC中的用户cookie将变为无效。用户无法在多个地方记住密码。
感谢您的意见。
答案 0 :(得分:2)
考虑一下:添加第二个cookie如何让那些可以窃取任意cookie的用户更难以以该用户身份登录?
没有。你必须把它绑在用户可以提供的东西上,但它不可能是一回事。如果你可以将它绑定到IP地址,那很好。如果不是,请考虑使用第一个密钥作为HMAC或其他东西来散列用户代理+用户ID。我仍然在尝试自己设计一个安全的登录系统,所以我可以告诉你什么肯定不起作用 - 这就是其中之一。
答案 1 :(得分:1)
答案仍然是相同的,也就是说SSL是确保人们无法嗅到纯文本cookie的唯一方法。如果您判断您愿意接受cookie可能被截获的风险,那么您的方法很好(但比必要的更复杂)。
假设您已经完成了SSL并不是您要使用的方法,我不确定您认为只有一个Cookie就可以提供两个单独的Cookie。
答案 2 :(得分:1)
您的计划是基于cookie偷窃偏执狂。实际上只有三种方法可以窃取cookie:
我们还会将恶意软件归类为实物用途。
让我们不要担心身体安全。如果用户失去了对他的机器的控制权,他将会遇到更多问题,而不是担心你的网站!
让我们也不要担心XSS,盲目地假设你已经尽力阻止它。
这会导致MITM攻击。
您可以针对MITM攻击获得的最佳(读取:仅)保护之一是SSL。如果您真的担心MITM,那么您应该通过SSL为整个网站提供服务。
您不需要两个自己的Cookie。您只需要会话cookie和记住我的cookie,顺便说一下,您可以简单地存储在多对一表中。这可以防止用户和Remember Mes之间强制一对一的关系。
答案 3 :(得分:0)
不要绑定到IP地址。这将使您的网站对于坐在NAT后面的任何人群(或在很多情况下aol)都没用。
当一个cookie是接收另一个cookie的先决条件时,多个cookie才真正有用。
如果网站需要登录,则可以生成并分配安全会话cookie,然后在后续页面加载时重新生成(对于不保持相同会话状态标识符的站点,不可能执行会话固定)通过会议)。
如果网站现在提示用户完成某种结帐流程,您可能希望将第二个Cookie实现为以某种方式链接到第一个Cookie的安全令牌。这两种cookie都成为通过网站进行交易的先决条件,使其难以固定。
最后,您可能希望在$ _SESSION超级全局中进行此链接。如果您的网站有任何合理的流量,那么在数据库中执行此操作可能会非常昂贵。这意味着每次需要操作或启动或停止用户会话时,都需要数据库连接和任意数量的查询/删除/插入/更新。这不可扩展。