我的代码中有许多实例需要快速访问登录的用户名和用户ID.我目前使用cookies.这不安全.
我认为会议将是一个解决方案,但会议到期.
另一种选择是将唯一令牌存储在cookie中,然后与数据库中存储的令牌匹配,以检索登录的用户数据.这是最安全的解决方案,但我看到的问题是,在我的代码中有很多次需要登录的用户名和用户ID,但是一直查询会占用资源不必要(这是真的吗?)
解决办法是什么?
我将尝试将评论中所说的所有内容合并到一个答案中.因此,请通过upvoting他们的答案/评论向其他有用的用户展示一些爱!我还将简要介绍会话的工作原理,使答案对更广泛的受众有用.
当用户登录网站时,会创建会话以识别它们.会话通过创建会话ID在PHP中处理,然后将该ID与服务器端的变量存储相关联,可以使用$_SESSION超全局在PHP脚本中访问.会话ID存储在客户端的cookie中,并标识其会话.
为了保持安全,会话ID必须是唯一的,随机的和秘密的.如果攻击者猜测您的会话ID,他们可以使用相同的ID在自己的计算机上创建cookie,并接管您的会话.他们会像你一样登录!这显然很糟糕,因此PHP使用强大的随机数生成器来创建这些会话ID.为了使事情更安全,您可以在站点范围内启用SSL,并通知浏览器仅使用仅HTTPS标志通过SSL发送cookie.不过,这可能对您的网站来说太过分了.
为了防止泄露的会话ID永远有用,或者在你去商店后坏人潜入你的房间,会话使用超时.最好让它们在相当短的时间后过期 - 根据您的安全要求,在10到60分钟之间.您可以在每次查看页面时重置超时,因此活动用户不会被注销.
为了让用户能够被记住(即"记住我"复选框),您需要提供一个用作身份验证令牌的cookie.请记住,出于所有意图和目的,此令牌与拥有密码相同.这意味着如果坏人窃取了cookie,他们就可以登录您的帐户.为了使此选项安全,我们可以使用一次性令牌.这些令牌应该是一次性的,随机的,冗长的和秘密的.把它们视为密码!
以下是如何实现它们:
/dev/urandom如果可以,请使用,否则您需要几百个值mt_rand来获得足够"随机"的内容,然后使用SHA1散列生成的字符串以生成令牌.您还应该运行一个查找非常旧的会话令牌(例如3个月或更长时间)的脚本并删除它们.这将要求用户在长时间不活动后返回时再次登录.
有关此问题的更长说明以及有关安全Web表单登录系统的更多重要信息,请阅读基于表单的网站身份验证的权威指南并查看OWASP项目.
如果客户端不需要它,请确保它不会最终出现在那里。
由于 userId 特定于登录用户而不是特定计算机,因此 cookie 似乎不是可行的方法。
PHP 中的基本身份验证通常通过会话完成,因此您也可以将 userId 添加到会话中。
如果会话时间太短,请增加会话时间。