PHP如何使用cookies创建安全的登录系统?

PHP如何使用cookies创建安全的登录系统?,php,security,session,cookies,Php,Security,Session,Cookies,我正在尝试使用cookies创建一个安全的登录系统。我读了很多关于如何实现这一目标的文章和问题,但没有找到任何有用的东西。每个人都建议用不同的方法来实现这一目标,但是那些看起来很理性并且知道自己在做什么的人,出于某种原因,我不能完全理解 你能给我解释一下,用cookies创建安全登录系统的最佳方法是什么吗 我听说,最好的方法是代币。但是有人说,您应该在数据库的token表中的用户id旁边添加一个token,那么如果一个人从不同的设备登录呢?有人说,你应该为此跟踪ip地址——所以如果一个人从另一个

我正在尝试使用cookies创建一个安全的登录系统。我读了很多关于如何实现这一目标的文章和问题,但没有找到任何有用的东西。每个人都建议用不同的方法来实现这一目标,但是那些看起来很理性并且知道自己在做什么的人,出于某种原因,我不能完全理解

你能给我解释一下,用cookies创建安全登录系统的最佳方法是什么吗

我听说,最好的方法是代币。但是有人说,您应该在数据库的token表中的用户id旁边添加一个token,那么如果一个人从不同的设备登录呢?有人说,你应该为此跟踪ip地址——所以如果一个人从另一个ip登录怎么办?有人说,你应该创建一个会话和一个cookie——但是会话的意义是什么(如果cookie验证了一个人)

我见过很多人提出类似问题的非正式问题,在回答中,人们试图解释Cookie和Session之间的区别。我知道所有的差异和所有的理论。我就是不懂让一切都安全的技术


我只是不能清楚地理解这个系统在逻辑上是如何工作的,所以你能一步一步地向我解释一下吗。谢谢。

既然您正在寻找最安全的解决方案(就今天的理解而言),我就有义务指出这一理论的解释和实现

安全登录系统的注意事项
  • 不要自己动手,除非你是安全专家,或者你有安全专家愿意事后审核你的代码(软件安全咨询并不便宜)
  • 使用bcrypt、scrypt、Argon2或PBKDF2散列您的密码
  • 使用PHP内置的会话管理系统
  • 在任何地方使用HTTPS,并具有严格的超文本传输安全性
  • 使用内容安全策略标头升级不安全的请求
  • 如果您需要实现“记住我”cookie,请遵循上述博文中的指导原则:
  • 生成两个随机标记:一个
    选择器
    和一个
    标识符
  • 选择器
    标识符
    存储在HTTP cookie中,设置为httpOnly=true和secure=true,以便只能通过HTTPS访问(并隐藏到JavaScript)
  • 选择器
    标识符
    的散列(这里可以使用SHA256)存储在令牌表中
  • 根据存储在用户cookie中的令牌对用户进行身份验证
安全登录系统的注意事项
  • 不要将密码存储在数据库中这从来都不是个好主意
  • 不要使用不安全的随机数生成器(要使用,如果使用的是PHP5,)

上述建议的简要安全性分析
  • 如果您使用的是正确实现的HTTPS,那么就不必担心像FireSheep这样的攻击
  • 如果您使用
    password\u hash()
    存储密码,并使用
    password\u verify()
    对存储的hash进行身份验证,那么您就完成了对攻击者转储整个数据库的深度防御
  • 对于长期身份验证(基于cookie),您已将查找(不可能在固定时间内实现,并且是由CSPRNG生成的随机选择器,因此您不太可能猜到)与验证分离
  • 存储长期标识符的散列,而不仅仅是标识符本身,作为对只读数据库泄漏的深度防御
  • 验证是在固定时间内执行的,这使得它对侧通道密码分析更具鲁棒性(翻译:没有人可以使用时间信息从数据库中挑出有效的长期身份验证令牌)
所以,所有流行的攻击向量(拦截、散列破解、击败弱随机数生成器)和一些理论攻击向量(定时泄漏)都被消除了。一点点好的安全工程会有很大的帮助



请记住,即使是安全建议也必须有有效期,因此,如果您在未来多年阅读此答案,其中一些可能会过时。不要自满,更好的方法不断被发现。

看看这个……一些简单和高级的版本可以选择。应该有助于您顺利完成:)问题是关于安全性,而不仅仅是登录systemRight,但是如果您查看现有的脚本,您可以看到优秀的开发人员如何处理它。@VIDesignz他们甚至没有使用Cookie。只是会话。塔克,如果你查看我给你的链接,他们会使用“记住我”饼干。其他一切都是基于会话的。下面是登录模型的链接,它是如何实现登录模型的起点。谢谢你的回答,这是非常清楚和专业的。但这并不是我所面临的问题。问题基本上出在饼干上。我如何存储RememberMeCookie(使用令牌或smth),以便用户无法使用它们入侵网站。我看过很多关于保护密码之类的帖子,但我不知道如何创建安全的“记住我”cookies。无论如何,请不要删除你的帖子,因为它仍然很有用。有人如何使用你的“记住我”cookies来入侵网站?我相信第一句中链接的博文解释得相当清楚,但最终,如果攻击者获得了有效令牌,那么他们就拥有了有效令牌。问题是:你谈论的是“理论”攻击向量,比如侧通道密码分析。你知道现在(在现实世界的黑客中)是否真的使用定时泄露攻击吗?坦斯克我会认真对待的。