【问题标题】:CGI::Session sharing sessions between clients!客户端之间的 CGI::Session 共享会话!
【发布时间】:2011-08-26 04:21:53
【问题描述】:

当我尝试这个时:

while (my $cgi = new CGI::Fast) {
    ...
    my $session = CGI::Session->new(undef, $cgi);
    ...
 }

我发现不同的客户正在获得相同的会话!什么会导致这种奇怪的会话共享?

编辑:我无法可靠地重现这一点,但在我的测试中,我看到了我从浏览器中删除会话 cookie、刷新页面并(使用 Firebug 的网络窗格)看到的情况我没有在请求中发送 cookie,而是在响应中使用 old 会话 ID 获得 Set-Cookie!由于使用 FastCGI,可能有什么东西卡在了内存中?

(注意:我从这个问题的早期版本中删除了第二段代码,因为我不再确定它是否相关)

编辑:这个http://osdir.com/ml/web.fastcgi.devel/2004-02/msg00007.html 似乎在描述我所看到的行为

编辑: 如上面 osdir.com 的帖子所述,FCGI.pm 包含以下代码:

for (keys %FCGI::ENV) {
    $ENV{$_} = $FCGI::ENV{$_} unless exists $ENV{$_};
}

在我看来,这似乎很明显有缺陷。只要当前请求没有为给定变量提供值,它就会从环境变量的持久副本复制到脚本可见的环境副本中。因此,如果一个请求没有 cookie,那么它不会找到定义的 HTTP_COOKIE,因此它将为脚本提供来自发送它们的最后一个请求的 cookie,这意味着其他会话!我不明白这段代码怎么可能是正确的,这是一个非常常用的模块!

【问题讨论】:

  • 查看 CGI::Session 代码,很难看出这有什么不同;你使用的是什么版本的 CGI::Session?
  • 是否有可能在第一个示例中,在第一个省略的代码段中,您不小心为 $cgi 分配了一些东西?如果 $cgi 是一个标量,它的值将用作会话 ID,这将解释重复的会话 ID。
  • $ perl -MCGI::Session -le 'print CGI::Session->VERSION' 给出:4.43
  • 我应该尝试切换到 mod_perl 吗?
  • 如果 fastcgi perl 处理程序像 mod_perl 的 Registry 处理程序一样工作,您可能会遇到 perl 闭包的一个微妙问题,它的效果与您所描述的非常相似。如果您 use warnings 并看到有关 bla will not stay shared 的消息,请查看此消息。

标签: perl cgi fastcgi


【解决方案1】:

你在使用 mod_perl 吗?如果是这样,全局变量将在请求之间持续存在,这将是间歇性的,因为这将取决于请求是否由同一个 apache httpd 进程处理,这取决于站点负载和其他变量。

【讨论】:

    【解决方案2】:

    我在大约七个月前修复了这个bug,您需要将 CGI.pm 升级到 >= 3.56。 CGI::Fast 使用的 FCGI API 在十多年前已被弃用并从文档中删除。

    【讨论】:

      猜你喜欢
      • 2016-12-26
      • 2013-06-20
      • 1970-01-01
      • 2016-05-03
      • 1970-01-01
      • 1970-01-01
      • 2020-07-04
      • 1970-01-01
      • 2012-07-06
      相关资源
      最近更新 更多