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()
?