【问题标题】:PHP secure way to store cookie data and compare to mysql entry?PHP存储cookie数据并与mysql条目比较的安全方式?
【发布时间】:2017-07-15 19:32:59
【问题描述】:

我有一个登录系统,我希望人们能够保持登录状态。我这样做的方式如下。当用户登录并单击“记住我”时,会创建一个 cookie。 cookie 有以下数据。

email:::randomString

“:::”只是电子邮件和字符串之间的分隔符。一个示例如下所示:

johndow@gmail.com:::EN8borW29qZMMJU8CNKivD91NFa3h5

字符串是随机生成的,不基于用户输入的任何内容。然后使用 bcrypt 对整个数据进行加密并存储在 cookie 中。 然后将该 cookie 上的数据的相同副本存储在 MySQL 表条目中。当用户在另一个会话期间加载页面时,cookie 被读取和解密。然后扫描该表以查找其中包含该电子邮件和该字符串的相同副本。如果是,那么用户会自动登录。由于以下原因,我不确定这是否是一种安全的方法。有人可以从该 cookie 中复制数据,并在他们的 PC 上使用准确的数据创建一个新的。当他们加载页面时,脚本会读取他们的 cookie 并检查数据库以查找匹配项,然后登录用户。

我怎样才能改进这种方法或完全采用一种新方法?

【问题讨论】:

  • 您可以添加IP地址,或者使用cookie和本地存储的某种组合。

标签: mysql cookies


【解决方案1】:
  1. 在您的 db 表中添加过期字段并检查您传入的 cookie,以便您可以使用另一个随机值重新更新您的 cookie,并迫使攻击者尝试新的 cookie 窃取或被阻止,
  2. 让您的 cookie 仅使用 http,
  3. 将浏览器操作系统信息存储在您的表中,并根据这些检查您的客户端请求,如果不匹配,则要求重新输入密码(您确实为每个用户附加了一个密码字段,对吗?),
  4. 前面的第 3 步暗示了一个“会话”表,以便我们可以跟踪哪些人已登录,哪些人未登录(我怀疑您的描述是无密码系统,这不是一个好主意,因此观察会话是必要的),
  5. 在登录期间及之后强制执行 https 协议。

或者, 在 github 中搜索 php 登录系统,但希望根据您的需求进行大量定制。

最近,我做了很多工作来定制这样一个系统,但由于与业务战略有关的原因,到目前为止我没有发布,但我向您保证,构建和保护这样一个系统还有很多工作要做!

作为奖励,我只发布了一个功能图,以理解我所谈论的复杂性以及在我们构建软件时使用文字处理软件制作的简单图表的有用性。就是将来能救你一命的东西!

【讨论】:

  • 当我将 cookie 数据存储在表中时,我应该在其中加密随机字符串还是仅在客户端 cookie 中加密?
  • 其他库的共同点是:客户端发送加密的值,服务器解密它并与未加密的值进行比较!我提请您注意一些冗余:我们是否需要 cookie 中的电子邮件等关键信息?表记录应将电子邮件与 cookie 中的唯一值结合起来。我是在描述php的会话系统吗?
  • 如果您坚持在客户端写入关键信息,因为它会使数据库系统失控(!)然后玩聪明:搜索“json web tokens”,jwt.io,选择一个 php lib (点赞github.com/firebase/php-jwt)并按照官方的方式在服务器之间或服务器与客户端之间加密cookie!
猜你喜欢
  • 1970-01-01
  • 2014-07-11
  • 1970-01-01
  • 2016-12-27
  • 1970-01-01
  • 2020-01-10
  • 2012-08-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多