3

背景:

我正在尝试编写一个定期连接到 Web 服务器的脚本,并检查特定页面上的某些信息是否已更改。我已经使用 bash(用于脚本)、curl(用于实际连接)和 crontab(用于调度)的组合来完成这项工作。

由于服务器需要身份验证,我首先使用 curl 使用我的凭据在登录页面上执行 POST 请求并保存 cookie 文件(包含 PHPSESSID)。现在我可以在对要检查的实际网页进行请求时使用 cookie 文件。

问题):

  1. 服务器何时真正清除我在第一个请求中设置的 PHPSESSID?我想它必须在某个时候这样做,否则它会崩溃,因为它会不断存储有关曾经启动的每个会话的信息。

  2. 如果 PHPSESSID 在关闭浏览器时被清除,是否有某种方法可以模拟,即使使用 curl?

4

2 回答 2

7

这比“当它被清除时”要复杂一些

会话在 PHP 中有一个生命周期。默认值为 24 分钟。这意味着在您连接到网站后,您的会话将一直有效,直到

  • 您关闭浏览器(除非您删除 cookie,否则不会使用 cURL 模拟)

    或者

  • 24分钟过去

每次加载页面并且服务器调用session_start()时,过期时间将额外增加 24 分钟(从技术上讲,它实际上是在session_start()调用页面上的脚本执行结束时增加 24 分钟)。

当该 cookie 实际过期时,您的会话不再有效,并且$_SESSION在服务器端将是空的。但是您的数据仍然在服务器上,直到下一次服务器执行会话垃圾收集周期以清除过期会话,这取决于服务器上使用的会话处理程序,可能会或可能不会实际删除您的数据。例如,一家银行可能会将数据发送到存档服务器,以备不时之需。

于 2013-02-20T13:54:11.880 回答
3

服务器在最后一次请求后经过会话超时时间后删除会话。默认为 1440 秒(24 分钟),可以在 php.ini 文件中更改。

关闭浏览器时会话不会刷新服务器端,但客户端会丢失其会话数据,因为浏览器会删除其会话的本地内存。但是,如果您将 sessionid 保存在安全的地方,您可以稍后再次使用它,当然如果您保持在超时范围内。

这正是会话劫持的工作方式,他们以某种方式获取您的 sessionid,然后可以在他们自己的机器上设置此 sessionid 并继续您的会话。

于 2013-02-20T14:00:29.083 回答