2011-05-16 18 views
6

Cuando probé esto:CGI :: sesiones de intercambio de sesiones entre los clientes!

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

he descubierto que los diferentes clientes estaban recibiendo la misma sesión! ¿Qué estaría causando este extraño intercambio de sesiones?

EDIT: no puedo reproducir este fiable pero en mis pruebas, he visto casos en los que borrar la cookie de sesión desde el navegador, actualiza la página, y (utilizando panel neto de Firebug) ver que soy no enviando una cookie en la solicitud pero obteniendo un Set-Cookie en la respuesta con un antiguo ID de sesión! Quizás algo se está quedando en la memoria debido al uso de FastCGI?

(Nota: he quitado una segunda pieza de código de una versión anterior de esta pregunta porque ya no estoy seguro de que es relevante)

EDIT: Este http://osdir.com/ml/web.fastcgi.devel/2004-02/msg00007.html parece estar describiendo el comportamiento que estoy ver

EDIT: Como se menciona en la publicación osdir.com anterior, FCGI.pm contiene este código:

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

Esto parece bastante claramente defectuoso para mis ojos. Se trata de copiar desde una copia persistente de variables de entorno en la copia del entorno visible para el script siempre que la solicitud actual no proporcione un valor para una variable determinada. Por lo tanto, si entra una solicitud sin cookies, no encontrará HTTP_COOKIE definido, por lo que le dará al script las cookies de la última solicitud que las envió, lo que significa otra sesión. No entiendo cómo este código podría ser correcto, ¡y este es un módulo muy utilizado!

+1

mirando el código CGI :: Session, es difícil ver cómo eso podría marcar la diferencia; ¿Qué versión de CGI :: Session estás usando? – ysth

+0

¿Es posible en el primer ejemplo, en el primer segmento de código elided, asignar algo a $ cgi accidentalmente? Si $ cgi es un escalar, su valor se usará como ID de sesión, y eso explicaría las ID de sesión duplicadas. –

+0

$ perl -MCGI :: Session -le 'print CGI :: Session-> VERSION' gives: 4.43 – JoelFan

Respuesta

1

¿Estás usando mod_perl? Si es así, las variables globales persistirán en las solicitudes, y esto será intermitente porque dependerá de si la solicitud es manejada por el mismo proceso de apache httpd o no, lo que dependerá de la carga del sitio y otras variables.

2

He solucionado esto bug hace aproximadamente siete meses, necesita actualizar CGI.pm a> = 3.56. CGI :: Fast usaba una API de FCGI que estaba en desuso y eliminada de la documentación hace más de diez años.

+0

¡Gracias por esa solución! –