【问题标题】:Which is the best session handler?哪个是最好的会话处理程序?
【发布时间】:2012-05-25 12:38:37
【问题描述】:

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

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

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

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

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

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

我的一位老师让我使用数据库会话验证。还有一次,irc 中的人骂我疯了,因为每次加载页面时只建立一个连接来验证这些内容,从而浪费大量内存。

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

有什么建议吗?

【问题讨论】:

  • 这取决于。但是,从您问题的第一部分来看,#irc 的问题是正确的:它已经存在。如果某些服务器忽略设置,则您有问题,某些服务器忽略设置,而不是您需要自己实现它;)
  • MD5 没有加密它是散列。完全不同的东西。加密是可逆的,散列不是。
  • 已更正大安,感谢您的注意。 KingCrunch 我同意,但我需要让我的应用程序在我测试的大多数服务器上运行,而且它无法运行真的很奇怪。

标签: php mysql session session-timeout


【解决方案1】:

不要依赖相同的 IP 地址。你的用户无法控制它。

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

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

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

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

【讨论】:

  • 你好 Marcus,不要忘记有人可以嗅探会话 id,并使用另一个 IP 并伪装成另一个用户。另一个带有令牌的 cookie 是什么意思?不应该将其保存到数据库中吗?而且如果保存到db中,是不是会慢很多?我正在对他们进行散列,对不起。类似 md5($last_visit_ip) 的东西,并在每一页上进行比较。
  • @IvoPereira,如果您使用 SSL,没有人会嗅探您的会话。不保证用户对每个请求都有相同的 IP 地址。到达请求的路由可以不同,只有 cookie 用于状态,而不是 IP 地址。是的,在服务器端,令牌将存储在数据库中,而在客户端,它将存储在 cookie 中。我看不出它会如何变慢,因为您只会在会话过期时使用它。我仍然不明白你为什么要散列 IP 地址。你可以用纯文本比较它。
  • 关于数据库会话的好处和避免会话固定/劫持的良好信息。
【解决方案2】:

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

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

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

对于有效场景,这将失败 - Google Chrome 会即时更新自身,即使是在会话中。

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

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

你没有说出你想用所有这些恶作剧来达到什么目的,所以不可能建议什么是正确的解决方案。到目前为止,这不是关于会话处理程序,而是关于如何管理会话。

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2016-06-26
      • 2010-10-03
      • 1970-01-01
      • 2016-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-02
      • 1970-01-01
      相关资源
      最近更新 更多