evita el secuestro de sesiones en PHP

6

Escribí los scripts de inicio / cierre de sesión de mi página web y cuando el usuario inicia sesión almaceno en la variable $_SESSION el agente de usuario. Ahora, cada vez que se carga una página, compruebo si el usuario ha iniciado sesión o no, y si ha iniciado sesión, compruebo si el agente de usuario ha cambiado o sigue siendo el mismo para evitar el secuestro. En caso de que haya cambiado, llamo a mi función logOut() :

function logOut($conn) 
{
    $sql = "UPDATE Users SET logged='no' WHERE username='" . $_SESSION['username'] ."'";
    $conn->query($sql); 

    // Unset all session values 
    $_SESSION = array();

    // get session parameters 
    $params = session_get_cookie_params();

    // Delete the actual cookie. 
    setcookie(session_name(), '', time() - 42000, 
    $params["path"], 
    $params["domain"], 
    $params["secure"], 
    $params["httponly"]);

    // Destroy session 
  session_destroy();    
}

Ahora, el problema es que el usuario correcto todavía puede navegar por mi sitio web cuando haya iniciado sesión, mientras que me gustaría tenerlo desconectado. ¿Cuál podría ser el problema?

Para probar mi código, inicié sesión con Mozilla Firefox y copié el valor de la cookie en Chrome, volví a cargar la página de inicio y, como era de esperar, no puedo iniciar sesión con Chrome, pero si vuelvo a cargar la página en Mozilla, sigue siendo conectado. Si elimino la verificación de agente de usuario, puedo acceder a la página cuando inicié sesión en Chrome para que mi código funcione a medias.

    
pregunta user3535688 14.12.2014 - 11:02
fuente

3 respuestas

4

Su esquema es problemático desde el punto de vista de UX y Seguridad.

UX incorrecto , si se implementa correctamente, un usuario que inicie sesión en su teléfono se desconectará de inmediato en su computadora, o lo que sea. Hay varios otros casos problemáticos en los que los usuarios que no deberían cerrar sesión se desconectan. Eso no es horrible, pero dependiendo del uso de su aplicación puede ser realmente molesto

Seguridad : primero, su código es vulnerable a la inyección de SQL.

$sql = "UPDATE Users SET logged='no' WHERE username='" . $_SESSION['username'] ."'";

Mi nombre de usuario es USERNAME' or '1'='1

Si esto está permitido en su política de nombre de usuario, un atacante puede forzar el cierre de sesión de todos los usuarios (o cualquier otro SQL que quieran). Use consultas parametrizadas o si es terco, arregle su política de contraseñas.

Finalmente, las comprobaciones de UserAgent probablemente no sean super efectivas. Las cadenas de User Agent no son super únicas. Por ejemplo, si su sitio web tiene 1 millón de usuarios que secuestran su sesión, el atacante probablemente usará el mismo navegador que una gran parte de ellos (sin siquiera intentar eludir su solución de seguridad).

Para responder a tu pregunta actual , session_unset() o session_destroy() hará lo que quieras, pero solo después de llamar a session_start() .

    
respondido por el Rell3oT 15.12.2014 - 01:21
fuente
0

esto es simple. primero establece la sesión de HttpOnly de Cookie use TLS ssl, lo que significa que tiene todo encriptado y se detectaron modificaciones establecer cookie.secure evitar cualquier inyección XSS, sql, o cualquier otra inyección  luego debe generar una nueva sesión en cada inicio de sesión e invalidar las sesiones anteriores

eso debería ser todo contra el secuestro de sesión

    
respondido por el user4237435 14.12.2014 - 23:29
fuente
-3

la mejor manera es seguir un tutorial

enlace

para destruir de forma segura

session_unset();
session_destroy();
    
respondido por el Naramsim 14.12.2014 - 15:57
fuente

Lea otras preguntas en las etiquetas