用PHP设计安全的自动登录cookie系统

Cod*_*ack 15 php cookies login-script setcookie

我想要为用户进行自动登录选项检查.基本上这意味着cookie将存储在客户端.

现在的问题是,如何使其安全,以便cookie不会被欺骗/修改.

我的一个朋友建议使用一个db表来存储session_id,用户的ip,浏览器信息等,然后在用户再次访问网站时将其与所有信息进行比较.

我觉得有一张单独的桌子有点太麻烦了.还有另一种方法吗?也许有令牌或类似的东西?

Exp*_*lls 26

你想要这个臭名昭着的cookie越安全,它对你来说就越麻烦.如果您的用户应该特别安全,那么您将不得不采用最麻烦的方法.

如果您希望尽可能安全,则只应使用https接受此cookie.如果通过http接受cookie,它可能会被嗅探并被盗.

我建议cookie根本没有用户数据(一个令牌,正如你的建议).不幸的是,这将需要另一张桌子.当用户登录并选择"保持登录"时,在此表中创建一个条目.该条目可以是任何无意义的值(例如md5(uniqid('', true));.该标记在DB中可以是唯一的并映射到用户的ID.

当用户访问您的网站时,您可以检查该cookie的值并获取其所属的用户并将其登录.此时,您将销毁旧令牌并创建一个新令牌."毁灭"可能意味着许多事情.您可以完全从数据库中删除它,也可以使用禁用令牌的标志.您可能希望允许多次使用相同的令牌,以防收到cookie但由于某种原因身份验证没有通过,但我认为这是不安全的.您可能还希望存储令牌的时间戳,并且只有在某段有限的时间内(例如30天)才接受它.

正如您的朋友指出的那样,您可以存储其他信息,例如用户代理,IP地址等,但即使使用相同的浏览器(尤其是移动设备),如果用户的持久登录不被接受,这些信息也可能会发生变化. ,它可能是刺耳的,不方便他们.

如果你真的不想创建另一个表,那么你必须存储一些方法来从cookie值中获取用户的ID.这不太安全.

  • @Uwe只是一个额外的安全步骤 - 为什么要坚持认证的时间长于需要的东西?可能还有更好的理由,但是例如,如果恶意用户获得您的令牌并且您永远不会销毁它,他们可以永远登录. (3认同)