-1

上个月我读了很多关于这个的书,我尝试了很多不同的东西,我听到了很多不同的意见。

在这个主题的完全无知中,我已经开始在 PHP 中构建一个自定义会话处理程序,在每个页面中运行一个验证脚本,检查保存在 $_SESSION 中的以下条件是否为真(所有这些条件都在 MD5 中散列):

1) IP 等于最后一页中最后使用的 IP 2) 浏览器等于最后一页中最后使用的

而且我有一个自定义会话超时,在登录中指定,这只是让我保持登录状态例如 5 分钟。我也在重新生成 id,每个页面。

我进入了#php irc 频道,有人说我疯了,因为我试图复制 php 预定义函数来完成这一切,并说我只是将 PHP 变量(session.max_time 等)设置到极限,这就足够了。

我已经设置了它,但它在某些服务器(localhost 和 webserv)中工作,其他人似乎忽略了它。

我的一位老师说我使用数据库会话验证。还有一次,irc 中的人们称我为每次加载页面时通过建立连接来验证这些内容而浪费大量内存而疯狂。

来吧,我真的不知道什么是正确的选择,应该遵循什么。

有什么建议吗?

4

3 回答 3

1

不要依赖相同的 IP 地址。那是您的用户无法控制的。

将会话存储在数据库中的一个原因是支持多个共享同一数据库服务器(或集群)的 Web 服务器。这使您可以扩展。它还让您不必担心 PHP 会话设置,因此许多第三方应用程序使用它只是为了简化支持。

在大多数情况下,默认的基于 cookie(基于服务器的文件)会话是可以的。确保在身份验证后立即使用 regenerate_session_id() 防止会话固定,并使用 SSL 防止其他会话劫持方式。

如果您需要用户保持登录状态,您可以正常使用会话,但您会在其上添加另一个表示令牌的 cookie。

当您说您的会话使用 MD5 加密时,我不明白您的意思。也许你可以进一步解释。

于 2012-05-25T12:51:46.633 回答
1

1)IP等于最后一页使用的最后一个IP

这将在有效场景下失败 - 例如通过负载平衡代理访问。

2) 浏览器等于最后一页使用的最后一个浏览器

对于有效场景,这将失败 - 谷歌浏览器将即时更新自身,即使是在会话中。

我也在重新生成 id,每一页。

如果用户打开多个浏览器实例,这将导致问题。如果用户提供不存在的 sesison id,或者当您更改身份验证状态时,您应该更改会话 id。其他时候不会。

您没有说出所有这些恶作剧要达到的目标,因此无法建议正确的解决方案是什么。到目前为止,这不是关于会话处理程序,而是关于如何管理会话。

我的一位老师说我使用数据库会话验证

为什么?大概这优先于基于默认文件的处理程序,但是您要解决哪些缺点?

于 2012-05-25T13:25:52.853 回答
0

我建议您在数据库中实现会话处理,因为它是最不受服务器设置影响的解决方案,同时也相对简单。您可以像使用 php 的会话处理函数一样使用它们,但是您将它们存储在数据库而不是磁盘中。谷歌一下,但我建议阅读http://www.devshed.com/c/a/PHP/Storing-PHP-Sessions-in-a-Database/

于 2012-05-25T12:52:23.090 回答