PHP会话验证 - 最佳实践

时间:2011-02-10 16:08:27

标签: php validation session

我有一个数据库,我将会话ID一旦验证给用户就存储了该数据库。

从安全角度来看,我是否应针对每个被访问的受保护页面检查存储在数据库中的会话ID的会话ID?

如果我不这样做,某人是否有可能劫持经过验证的会话ID,并使用必要的变量发帖以访问受限制的页面?

从性能的角度来看 - 如果我应该针对每个请求针对数据库检查会话ID,那么将验证的会话ID存储在他们自己的文本文件中而不是进行如此多的数据库查询会更有效吗?

提前致谢。

4 个答案:

答案 0 :(得分:3)

是的,您应该检查每个请求的会话ID。尽管滚动会话ID有助于缓解这种情况(即更改每个请求的会话ID),但仍有可能发生会话劫持。

如果您的RDBMS支持结果缓存(MySQL调用此查询缓存),则验证文本文件中的会话ID与数据库相比效率会更高。

如果您的查询只是验证是否存在类似SELECT COUNT(session_id) FROM sessions WHERE session_id = ?的会话ID(您正在使用参数化查询来阻止SQL注入,对吗?)那么这可能会被缓存(尽管MySQL可能不会在早于5.1.17)。

如果/当没有缓存时,查找不应导致任何问题。此时切换到内存中的表可能是一个好主意。

答案 1 :(得分:2)

关于安全:
您自己很好地描述了劫持风险。更重要的是这种情况发生的可能性以及您的网站/数据的敏感程度。

现在,如果某人接管了未破坏会话的注册用户的电脑(注销),您将如何确定?为什么/如何更改会话ID并仍然有效?
通过访问cookie,检查ip(在ip change re-logon上),检查调用者的身份可能会更好,...

关于表现:
通常,文本文件查询应该比数据库查询花费更长的时间,因为文本文件几乎总是文件系统/存储查询,而数据库查询通常在内存中(缓存)。登记/> 将您的数据库视为在后台运行的另一个软件程序 - 如果它在同一台服务器上运行,它基本上可以立即访问。

- >如果我错了,请纠正我......

答案 2 :(得分:1)

  

从安全的角度来看,我应该   正在检查会话ID   存储在数据库中的会话ID   每个受保护的页面都被访问?

     

如果我不这样做,不会   可能有人劫持了   验证会话ID,并发表帖子   用必要的变量来访问   限制页面?

是的,您可能希望在数据库中包含一些其他信息 - 例如上次访问,IP地址。

答案 3 :(得分:0)

一般来说,当您更改用户的状态时,会发生检查和重新生成ID会话。 IE:用户X获得管理员访问权限:您必须在授予访问权限之前检查会话ID,并在操作后重新生成新ID。