use_only_cookies una sesión sesiones seguras que manejo las hijacking funcionamiento fixation control aplicación php security session sessionid session-hijacking

php - una - sesión hijacking



Prevención de secuestro de sesión adecuada en PHP (1)

Su configuración es impresionante. Definitivamente, usted lee sobre cómo bloquear las sesiones de php. Sin embargo, esta línea de código niega gran parte de la protección proporcionada por su configuración de php: session_id(sha1(uniqid(microtime()));

Este es un método particularmente horrible para generar un ID de sesión. Según sus configuraciones, está generando el ID de sesión desde /dev/urandom que es un grupo de entropía impresionante. Esto va a ser mucho más aleatorio que uniqid () que ya es principalmente una marca de tiempo, agregar otra marca de tiempo a esta mezcla no ayuda en absoluto. Eliminar esta línea de código, lo antes posible.

La verificación de la dirección IP es problemática, las direcciones IP cambian por razones legítimas, por ejemplo, si el usuario está detrás de un equilibrador de carga o TOR. La verificación del agente de usuario no tiene sentido, es como tener una variable GET como ?is_hacker=False , si el atacante tiene el ID de sesión, probablemente tenga el agente de usuario, y si no lo hace, este valor es realmente fácil de atacar.

Sé que este tema se ha discutido mucho , pero tengo algunas preguntas específicas que aún no han sido respondidas. Por ejemplo:

// **PREVENTING SESSION HIJACKING** // Prevents javascript XSS attacks aimed to steal the session ID ini_set(''session.cookie_httponly'', 1); // Adds entropy into the randomization of the session ID, as PHP''s random number // generator has some known flaws ini_set(''session.entropy_file'', ''/dev/urandom''); // Uses a strong hash ini_set(''session.hash_function'', ''whirlpool'');

// **PREVENTING SESSION FIXATION** // Session ID cannot be passed through URLs ini_set(''session.use_only_cookies'', 1); // Uses a secure connection (HTTPS) if possible ini_set(''session.cookie_secure'', 1);

session_start(); // If the user is already logged if (isset($_SESSION[''uid''])) { // If the IP or the navigator doesn''t match with the one stored in the session // there''s probably a session hijacking going on if ($_SESSION[''ip''] !== getIp() || $_SESSION[''user_agent_id''] !== getUserAgentId()) { // Then it destroys the session session_unset(); session_destroy(); // Creates a new one session_regenerate_id(true); // Prevent''s session fixation session_id(sha1(uniqid(microtime())); // Sets a random ID for the session } } else { session_regenerate_id(true); // Prevent''s session fixation session_id(sha1(uniqid(microtime())); // Sets a random ID for the session // Set the default values for the session setSessionDefaults(); $_SESSION[''ip''] = getIp(); // Saves the user''s IP $_SESSION[''user_agent_id''] = getUserAgentId(); // Saves the user''s navigator }

Entonces, mis preguntas son

  • ¿Los ini_set proporcionan suficiente seguridad?
  • ¿Está bien guardar la IP y el navegador del usuario y luego verificarlo cada vez que se carga la página para detectar un secuestro de sesión? ¿Podría esto ser problemático de alguna manera?
  • ¿es correcto el uso de session_regenerate_id() ?
  • ¿es correcto el uso de session_id() ?