Sistema de inicio de sesión seguro: ¿usando sesiones?

4

Estoy buscando una forma segura de permitir a los usuarios iniciar sesión en mi sitio web. Actualmente, siempre he usado un sistema de sesión, como este:

<?php
session_start();

if (validPass() || isset($_SESSION['userId'])) {
    if (isset($_GET['logout'])) {
        session_destroy();
    } else {
        if (!isset($_SESSION['userId'])) {
            $_SESSION['userId'] = $the_id;
        }
        // User is logged in
    }
} else {
    // Show a login form
}
?>

¿Es esta la forma segura, o hay mejores sistemas? ¿Qué debo tener en cuenta?

    
pregunta Keelan 12.04.2013 - 17:10
fuente

3 respuestas

6

¿Una forma más segura? Utilice https junto con esto. Aquí hay dos vulnerabilidades:

  • Cuando el usuario inicia sesión, la contraseña que se envía puede ser leída fácilmente por cualquiera que espíe su conexión. Esto no puede suceder en una conexión https.
  • Si un usuario ya ha iniciado sesión, alguien que espíe su conexión puede copiar las cookies de la sesión. En HTTPS, las cookies se transmiten de forma segura, por lo que no hay mucho problema.

También es posible que desee registrar la dirección IP del usuario y no permitirle que cambie, aunque esto puede resultar molesto (para un usuario como yo que está detrás de un proxy de la universidad con IP externas rotativas, nunca podré iniciar sesión ).

Una observación final: no use GET para el bit de cierre de sesión. Trate de no usar GET para cualquier cosa que active un cambio; está bien para la navegación, pero no para cualquier cosa que lleve a que algo cambie en el servidor (un logout, o cualquier cosa que escriba en una base de datos). Consulte el uso prescrito de GET y POST para obtener más detalles .

Si implementa lo anterior, asegúrese también de que la referencia de una solicitud POST sea su sitio y no otro sitio. (Esto, junto con lo anterior, ayudará a prevenir los ataques de CSRF ).

Para evitar clickjacking , deshabilite el encuadre a través de javascript y el encabezado X-Frame-Options: deny .

    
respondido por el Manishearth 12.04.2013 - 17:33
fuente
1

Solo para mejorar el método de verificación, intente agregar algunas cosas sobre el inicio de sesión seguro del usuario.
Intente usar force cast con (int) para evitar cualquier caso que el atacante pueda usar para pasar cualquier cadena maliciosa y también un cheque no vacío.

<?php
if (isset($_SESSION['userId']) && (!empty($_SESSION['userId'])) {
  $user_id= (int)$_SESSION['userId'];
} else {
  $user_id=0;
}

echo 'Test: '.$user_id;
?>
    
respondido por el AlexCode 12.04.2013 - 19:00
fuente
1

Para agregar a la respuesta de Manishearth, también recomendaría lo siguiente:

  1. Configura las cookies para que sean HttpOnly y Secure Siempre escriba de forma segura (para asegurarse de que solo pueda leerlo el sitio habilitado para HTTPS) y HttpOnly (para asegurarse de que no esté accesible a través de Script: puede ser peligroso si XSS aparece en su sitio)

  2. Habilite los encabezados frontales como la Política de seguridad de contenido, Política de transporte estricto.

respondido por el Novice User 12.04.2013 - 20:43
fuente

Lea otras preguntas en las etiquetas