2011-05-16 109 views
6

當我嘗試這樣做:CGI ::客戶端之間的會話共享會話!

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

我發現不同的客戶端都得到相同的會話!什麼會導致這個奇怪的會話分享?

編輯:我無法可靠地重現這一點,但在我的測試中,我看到了從瀏覽器中刪除會話cookie,刷新頁面和(使用Firebug的網絡窗格)的情況,看到我不在請求中發送cookie,但在響應中得到一個Set-Cookie,其中舊的會話ID!由於使用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,這意味着一些其他會話!我不明白這個代碼可能是正確的,這是一個非常高度使用的模塊!

+1

看着CGI :: Session代碼,很難看出如何纔能有所作爲;你使用的是什麼版本的CGI :: Session? – ysth 2011-05-16 05:32:20

+0

在第一個例子中,在第一個消失的代碼段中,您是否可能意外地爲$ cgi分配了一些內容?如果$ cgi是標量,則其值將用作會話標識,並且這將解釋重複的會話標識。 – 2011-05-16 07:45:39

+0

$ perl -MCGI :: Session -le'print CGI :: Session-> VERSION'給出: 4.43 – JoelFan 2011-05-16 11:02:38

回答

1

您使用的是mod_perl嗎?如果是這樣,全局變量將持續請求,這將是間歇性的,因爲它將取決於請求是否由相同的apache httpd進程處理,這取決於站點負載和其他變量。

2

大約7個月前,我修正了這個bug,你需要將CGI.pm升級到> = 3.56。 CGI :: Fast使用的FCGI API在十多年前已被棄用並從文檔中移除。

+0

感謝您的修復! – 2012-04-18 00:51:49