对于多平台WebApp,什么是良好的UserManagement实践

时间:2011-07-03 12:48:13

标签: php mysql security user-management

我希望您对强健框架/代码(RoR,Zend,Symfony,Django ......)使用的内容提出建议。

我用于我的用户管理系统(理解:登录,注销,用户登录,user_id,用户名等等;)一个简单的小框架(userCake)。我正在重构我的代码,为iPhone / Androi / Js使用API​​,我想刷新这段代码。我需要知道我是否只是重新安排我的类,依赖项,类并保持相同的过程,或者如果我需要更改某些内容。

目前的比赛状态
用户成功登录后,我检索他的所有数据,序列化它,创建一个sessionID。我将此sessionID存储在用户Cookie中,并将所有序列化数据存储在链接sessionID和数据的数据库表中。

然后,在我的网站上,每次请求页面时,我从DB检索与用户在其cookie /会话中具有的sessionID匹配的序列化数据。然后我进行查询以确保用户名和散列密码在我的数据库中匹配,我的用户仍处于活动状态(未禁止或删除)。与我的api相同(iphone,android,js必须给我sessionID)。

我有一个cronjob从我的会话表中删除过期的那个。当用户注销时,它是相同的,我删除了我的数据库中的行并清除用户Cookie。

我在寻找什么
我上面解释的对我来说似乎很好。但它足够安全吗? 是否真的需要在每次使用用户名和密码都很好的情况下进行双重DB检查,我不能只信任会话表中的序列化数据吗?

如何在着名的框架中完成所有工作(Django,Rails,Symfony ......)?

1 个答案:

答案 0 :(得分:1)

<强>首先

  

用户成功登录后,我   检索他的所有数据,序列化,   创建一个sessionID。我存储了这个   用户Cookie中的sessionID和所有   数据库表上的序列化数据   链接sessionID和数据。

当你“检索他所有的数据”时,这已不是数据库了吗?为什么你会将数据序列化并将其放回数据库的另一部分?为什么不将用户ID存储在会话变量中,并使用它来查询您可能需要的任何用户信息?

<强>第二

  

然后我进行查询以确保这一点   用户名和哈希密码   匹配我的数据库

您在哪里获取用于测试数据库的每个请求的用户名和密码?听起来好像是在测试用户并将数据库中序列化的商店与数据库中的原始信息一起传递给你。如果是这样,这将始终匹配,因为您自己设置。

<强>第三

为什么使用cron作业删除过期的会话?会话具有内置的过期机制。

通常,您需要使用指纹识别和/或趋势保护会话。然后,您只需将用户的主数据库密钥保存在会话变量中,并使用该请求检索您可能需要的任何用户数据。此外,您不需要创建会话ID并自己将其存储在cookie中。当您调用session_start()时,PHP会为您处理此机制,然后将要保存的任何会话变量存储在$ _SESSION超全局数组中。您提到的大多数框架都是开源的,因此如果您愿意,您可以查看他们的代码并亲自了解他们的工作。