上个月我一直在阅读这篇文章,我尝试了很多不同的东西,并且听到了很多不同的意见。
在这个主题的完全无知中,我已经开始在PHP中构建自定义会话处理程序,在每个页面中运行验证脚本,检查$ _SESSION中保存的以下条件是否为真(所有这些都是哈希值MD5):
1)IP等于最后一页中使用的最后一个IP 2)浏览器等于最后一页中使用的最后一次
我有一个自定义会话超时,在登录中指定,只允许我保持例如5分钟登录。我也在重新生成id,每页。
我进入了#php irc频道,有人叫我疯狂试图复制php预定义函数来完成所有这些,并且说我只是设置PHP变量(session.max_time等)达到极限,这就够了。
我已经设置了它,但它在某些服务器(localhost和webserv)中有效,其他服务器似乎忽略了它。
我的老师说我要使用数据库会话验证。还有一次,irc的人们每次通过建立连接来加载页面时都会因为浪费大量内存而疯狂。
来吧,我真的不知道什么是正确的选择,应该遵循什么。
有任何建议吗?
答案 0 :(得分:1)
不要依赖IP地址相同。这对你的用户来说是失控的。
在数据库中存储会话的一个原因是支持多个共享同一数据库服务器(或群集)的Web服务器。这允许您缩放。它还使您免于担心PHP会话设置,因此许多第三方应用程序仅使用它来简化支持。
在大多数情况下,基于cookie的默认(基于服务器的文件)会话很好。确保在身份验证后立即使用regenerate_session_id()阻止会话固定,并使用SSL来防止其他会话劫持方法。
如果您需要用户保持登录状态,您可以正常使用会话,但是在其上添加另一个表示令牌的cookie。
当您说您的会话使用MD5加密时,我不明白您的意思。也许你可以进一步解释。
答案 1 :(得分:1)
1)IP等于最后一页中使用的最后一次
对于有效的情况,这将失败 - 例如通过负载平衡代理访问。
2)浏览器等于最后一页中使用的最后一页
对于有效的情况,这将失败 - 谷歌浏览器将动态更新,甚至在会话中期。
我每个页面都重新生成了id。
如果用户打开多个浏览器实例,这将导致问题。如果用户提供了不存在的sesison id,或者更改了身份验证状态,则应更改会话ID。不是在其他时间。
你没有说你想要用所有这些恶作剧来实现什么,所以不可能建议正确的解决方案是什么。到目前为止,这不是关于会话处理程序,而是会话的管理方式。
我的老师说我要使用数据库会话验证
为什么呢?据推测,这优先于基于默认文件的处理程序,但您想要解决哪些缺陷?
答案 2 :(得分:0)
我建议你在数据库中实现会话处理,因为它是最服务器设置的解决方案,同时相对简单。您可以像使用php一样使用php的会话处理功能,但是将它们存储在数据库而不是磁盘中。谷歌有点,但我建议阅读http://www.devshed.com/c/a/PHP/Storing-PHP-Sessions-in-a-Database/