【发布时间】:2011-05-11 01:56:57
【问题描述】:
我有一个小网络应用程序,它使用了很多 ajax。有人登录后,我们需要持久化的是他们的user_id和group_id
我第一次进行身份验证的方式是,我只是将这些作为 clear txt 存储在 cookie ( $_COOKIE['user_id'], $_COOKIE['group_id'] ) 中。显然这很糟糕,因为您可以修改这两个值!
我不是一个经验丰富的程序员,也不需要为这个应用提供惊人的安全性。但这很糟糕。
因此,我继续在数据库中创建一个令牌,该数据库存储 user_id、group_id 和一个哈希令牌,然后将该令牌仅放入 cookie 中。一旦令牌通过身份验证(cookie 匹配数据库),user_id 和 group_id 就会创建为会话。
这更安全,但是必须管理 user_id 和 group_id 会话(超时、重新初始化)与仅从 cookie 中获取它们的整个过程造成了很多麻烦,并使我的应用程序的实际功能不太可靠。
现在接受我的技能水平,并且我的应用程序的简单管理 + 强大的功能比高级安全性更重要......我想知道我是否可以取消会话,并通过仍然做出妥协将 user_id 和 group id 存储在 cookie 中,但与哈希一起存储 - 即
COOKIE['token'] = user_id_val+group_id_val+hash_in_db
看起来像:23-144-jhwr8324398fjk2j49083223n23
所以我只需要一个小函数来解析该字符串并从中执行所有操作。有人可以更改值,但显然哈希不匹配。
这样好吗?
【问题讨论】:
-
作为替代方案,读取每个脚本顶部的 cookie 值,每次都将用户 ID 和组 ID 拉入新的。这样,只要 cookie 存在,您的会话就不会超时。
-
你仍然需要维护一个有效令牌的列表,否则有人可能会开始在其中放入不同的 id 并且你们都在:
22_345_fasfsdfdfklsdflk... 当然,哈希可能不匹配,但是使用彩虹表和蛮力,找出您正在使用的任何静态盐不会太难。再次提醒我仅使用常规会话有什么问题(基于 PHP 的会话)? -
对于这个应用程序,“记住我”行为是默认行为,因为它通常在后台保持打开状态。所以cookie是必要的。因此,为简单起见,如果我可以从 cookie 中完成所有操作,那就更好了。此外,目前,我正在尝试对 cookie 进行身份验证,并在每个脚本顶部需要时重新创建会话,但这似乎有点不稳定。对不起,我不能更准确。我意识到适当的会话管理会很好,但我似乎更容易坚持仅使用 cookie 的路线,只要它不太不安全。
-
那么为什么您认为将用户 ID 和组 ID 与散列一起存储比仅存储散列更好?您是否希望跳过哈希查找并在不验证数据的情况下使用用户 ID 和组 ID?
-
是的,我仍然会在 MySQL 中生成和存储匹配的令牌,没有问题。我会在他们注销/登录时重新创建它们。但由于这个应用程序的工作方式,大多数人会长时间保持登录状态
标签: php mysql authentication cookies