¿Cuando se requiere cerrar sesión en un sitio web, se destruye la sesión?

2

En PHP, no estoy seguro de si debo iniciar la sesión antes de destruirla cuando un usuario desea cerrar sesión.

session_start();
session_destroy();

¿Hay algo más que deba hacerse?

EDITAR: He vuelto a publicar en Stackoverflow aquí pero todavía no entiendo completamente.

Básicamente, pregunto, dime, ¿qué se debe hacer al cerrar la sesión? Lo sé, ya que creo una sesión con session_start() al iniciar sesión. Debo llamar a session_destroy() . Algunas páginas SO dicen que llamar a session_regenerate_id(true) y session_unset() también y no entiendo por qué.

    
pregunta Celeritas 07.03.2013 - 00:11
fuente

4 respuestas

2

No, no deberías estar haciendo esto y no solo por ganancias mínimas de rendimiento. Me doy cuenta de lo que te hizo pensar que sería una buena práctica, pero analicemos un poco más estas dos citas del manual de PHP:

  

session_start() crea una sesión o reanuda la sesión actual basada   en un identificador de sesión pasado a través de una solicitud GET o POST, o pasado   a través de una cookie.

     

session_destroy() destruye todos los datos asociados con el   sesión actual. No anula ninguna de las variables globales.   asociado a la sesión, o desactive la cookie de sesión. Usar el   las variables de sesión nuevamente, session_start () debe ser llamada.

Está bien, eso está claro. También menciona en su publicación en SO que existe la posibilidad de que el usuario pueda navegar directamente a este URI desde donde ejecutará este código. Realmente no debería hacer esto y al menos debe verificar los datos de inicio de sesión del usuario y la cadena de referencia antes de iniciar la sesión y eliminar la sesión cada vez que cambie el estado del usuario. Pero digamos que no cambió su código y podemos navegar al URI en cuestión. Ahora imagine este escenario:

  • Tengo acceso a una de las computadoras de su usuario legítimo, su red, puedo acceder a su aplicación web a través de la misma IP y puedo recopilar sus datos de sesión del lado del cliente
  • Realizo una solicitud POST o GET sin datos de sesión a su URI que ejecuta este código
  • Agrego manualmente estos fragmentos de sesión (cookie de sesión, cadena de usuario-agente) a los que tengo acceso en mi navegador modificado

Voila!

Todo esto es realmente fácil de hacer y muchas personas con acceso directo a la computadora del usuario específico tendrían los medios y las razones para hacer tal cosa, si solo tuvieran conocimiento de ello. Y estás bajando ligeramente esa barra.

Veamos qué pasará.

Se llamará a

session_start() antes de que la sesión se invalide en su servidor web (lo que ocurre en session_destroy() ), creando una nueva sesión de usuario. Luego puedo reemplazar los datos de mi nueva sesión con el antiguo (robado), y su aplicación web tendrá (según los datos de mi sesión de usuario final) ninguna razón para sospechar que no soy el usuario para el que se creó la sesión la primera vez. lugar. Se reanudará como si fuera el usuario anterior al que robé los datos de la sesión.

Entonces, ¿en qué se diferencia esto del secuestro de sesión cuando se utilizan las rutinas de manejo de sesión en el orden previsto?

En una larga discusión con @Xander que disecciona las rutinas de manejo de sesiones de PHP, hemos llegado a la conclusión de que no cambia nada en ese sentido. Sin embargo, tampoco gana nada haciéndolo, y podría resultar en una ruptura de la funcionalidad de cualquier marco de sesión de usuario de terceros, si su aplicación PHP depende de. Comentando su pregunta SO relacionada "Me preocupa que si un el usuario navega directamente a esta página puede haber un error al destruir la sesión " expone otra preocupación, es que básicamente está permitiendo que el explotador vea su estructura de datos de sesión de usuario final de forma gratuita, sin ninguna autenticación de usuario antes de crear eso. Decir "¡Pero lo estoy eliminando inmediatamente!" realmente no se aplica en este sentido, ya que session_destroy() "... no anula ninguna de las variables globales asociadas con la sesión , o desactive la cookie de sesión. " Diciéndolo de manera diferente:

¡Acabas de hacer el secuestro de sesiones un poco más fácil, no al revés!

TL; DR : en resumen, tendrá que hacerlo 'la forma aburrida y estándar' , ya que está en el orden en que se realizaron estas dos rutinas de cambio de sesión. diseñado para funcionar.

    
respondido por el TildalWave 07.03.2013 - 21:34
fuente
1

Depende totalmente de lo que realmente haga su aplicación específica, pero una guía adicional general que sugeriría sería destruir cualquier cookie que haya creado.

    
respondido por el Xander 07.03.2013 - 00:20
fuente
1

Si sigue a OWASP, hay mucho sobre cómo proteger las conexiones y mantener una sesión segura estado. Te darían una buena explicación sobre cómo iniciar de forma segura una nueva conexión. Algunos son

  1. No permita que el proceso de inicio de sesión comience desde una página sin cifrar. Inicie siempre el proceso de inicio de sesión desde una segunda página cifrada con un token de sesión nuevo o nuevo para evitar credenciales o sesión robo, ataques de phishing y ataques de fijación de sesión.

  2. Considere la posibilidad de regenerar una nueva sesión luego de una autenticación exitosa     o cambio de nivel de privilegio.

  3. Limite o elimine su código de cookies personalizadas para fines de autenticación o administración de sesión, como la funcionalidad de tipo "recordarme" o la funcionalidad de inicio de sesión único en el hogar. Esto no se aplica a soluciones de autenticación federadas o SSO sólidas y bien probadas.

Aquí está la prueba para la reutilización / reparación de cookies

    
respondido por el Saladin 07.03.2013 - 19:18
fuente
1

Acadion Security ha publicado un informe sobre cómo implementar de forma segura las sesiones de usuario en una aplicación web. No solo la sesión debe destruirse al cerrar la sesión, sino que la sesión debe destruirse en:

  1. Tiempo de espera
  2. Cerrar sesión
  3. Transferencia sin cifrar
  4. Origen incorrecto
  5. Inicio de sesión dual
  6. Restablecimiento de contraseña
  7. Cambio de agente de usuario
  8. Regeneración de sesión ocasional

Los detalles se pueden encontrar en el documento aquí .

    
respondido por el void_in 08.03.2013 - 08:55
fuente

Lea otras preguntas en las etiquetas