gpt4 book ai didi

php - 在 php 中进行用户身份验证的最佳方法是什么?

转载 作者:IT王子 更新时间:2023-10-29 00:12:09 25 4
gpt4 key购买 nike

我只是写了 2 个 cookie,第一个包含用户 ID,第二个包含 1/2 的密码 SH1 散列(加盐)。它的工作方式是不言而喻的。

我意识到我没有以最安全的方式进行此操作。这样做的更好方法是什么?最好使用单个身份验证 cookie。

此外,使用“难以计算的哈希值”是否有意义?我的意思是,使用 bcrypt,或使用漩涡对每个项目进行 10,000 次哈希处理,使其成为一个(相对)慢的哈希函数(200 毫秒对普通 SHA1 不到 1 毫秒)?我的意思是,如果有人破坏了您的数据库并获取了哈希值……还有什么需要保护的,因为您的所有数据都在同一个数据库中(除非您有某种去中心化设置,我没有)。

最佳答案

使用Sessions .在cookie中存储session id,在服务器端存储用户的状态(loggedIn、userId、IP)。

阐明您需要在 session 数组中存储的内容:

  • loggedIn:关于用户是否登录的 bool 变量。您在多个 session 中重复使用同一个 cookie,这样您就可以在用户下次访问您的网站时记住他们的用户名,等等。
  • userId: 用户在数据库中的唯一标识。使用它来获取有关用户的更多信息,例如用户名、电子邮件等。在用户注销后,这些信息也可以保留在 session 数组中。
  • IP:为了防止有人窃取 session ID 并使用它,您还存储了用户的 IP。这是可选的,因为有时您希望允许用户漫游(例如,stackoverflow 允许我带着笔记本电脑四处走动,而无需在 IP 更改时注销)。
  • lastPing: 最后一次看到用户的时间戳。这可以用来代替 cookie 过期日期。如果您还存储了 session 的生命周期,那么您可以在用户不活动时将其注销。这意味着 session ID cookie 可以在用户计算机上存储很长时间。

当用户注销或由于不活动而注销时,您只需将 loggedIn 设置为 false。当用户使用正确的用户名和密码登录时,您将 loggedIn 设置为 true 并更新其他字段(userId、IP、lifetime)。当用户加载页面时,您检查 lastPing 与当前时间和 lifetime,然后更新 lastPing 或注销用户。

session 数据可以存储在文件系统或数据库中。如果存储在数据库中,那么userId要么是用户记录的外键,要么所有的数据都可以放在用户记录中。

散列

多次重新散列一个值不是一个好主意,因为你 reduce the security .取而代之的是使用盐,将静态盐(例如页面名称)和用户的用户名以及密码组合在一起。花费很长时间的散列并不比快速散列好,导致大摘要的散列优于导致短摘要的散列(由于蛮力)。使用 SHA1 对于普通站点(IE,不是银行或 secret 军事组织)应该足够了。

关于php - 在 php 中进行用户身份验证的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2179520/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com