帮助我看看我是否正确理解会话如何在PHP中工作

时间:2011-01-23 12:30:46

标签: php session session-timeout

  1. 会话ID存储在客户端上的方式通常在浏览器关闭时消失(存储为cookie?)。
  2. 会话ID和关联数据存储在服务器上(其中?),用于启动它的每个客户端。
  3. 我想知道的主要问题是服务器如何知道会话何时结束。如果客户端不再存储会话ID(例如,在关闭浏览器之后),并且他们尝试向服务器请求另一个会话,则会启动新会话。服务器是否知道在一段时间后垃圾收集以前的会话数据?在我看来,这可能会被滥用......

3 个答案:

答案 0 :(得分:2)

  1. 会话ID通常使用cookie存储在客户端浏览器上(或者,在URL参数中,但不建议这样做,如http://php.net/manual/en/session.security.php中所述)
  2. 会话存储在session.save_path定义的目录中(例如/var/lib/php/sessions),或者系统的临时目录(如果未设置)(通常为/tmp)。
  3. 会话在请求期间由PHP本身定期进行垃圾收集,或者通过cron作业进行垃圾收集(例如在Debian上这是默认设置)。见http://php.net/manual/en/session.configuration.php#ini.session.gc-probability

      

    我想知道的主要问题是服务器如何知道会话何时结束

    他不知道。但是,他知道自某段时间以来某个会话何时未被使用,因此它可以删除未使用的会话。

      

    服务器是否知道在一段时间后垃圾收集以前的会话数据?

    是。这由session.gc_maxlifetime ini设置定义。在垃圾收集期间,将删除任何早于此的会话。可以使用session.gc_probabilitysession.gc_divisor ini设置调整垃圾收集频率。 (见doc。)

      

    在我看来,这似乎可以被滥用。

    如果您的意思是某人可能能够在服务器上创建过多的staled会话;是的,这可能是真的。

答案 1 :(得分:0)

你所描述的是完全正确的。是的,它很容易被滥用。甚至还有一个工具可以自动劫持你周围的会话(搜索firesheep)。会话通常存储为SESSION cookie或每次在服务器和客户端之间传递 检查PHP是否有一个非常简短的intro,一些谷歌会话和安全性将帮助你进一步。

答案 2 :(得分:-2)

会话自动过期并根据设置清除(例如,在没有使用20天之后)并且它们存储在linux上,通常在/ tmp /

检查php.ini以获取更多信息