Comenzando una sesión segura de php

7

He estado estudiando la creación de sesiones de php seguras para usarlas en un script de inicio de sesión durante una semana aproximadamente. Hasta ahora no he encontrado un recurso concreto para basar mi trabajo, leyendo StackOverflow todo lo que he visto son opiniones y opiniones mixtas.

Decidí sumergirme y dar a la escritura una función para comenzar la sesión.

Con una lectura extensa y viendo la presentación de Samy Kamkar de DEFCON en Youtube, estoy bastante seguro y satisfecho con la primera parte de este sistema que he escrito.

$session_name = 'sec_session_id'; // Set a custom session name
$secure = false; // Set to true if using https else leave as false
$httponly = true; // This stops javascript being able to access the session id 
ini_set('session.use_only_cookies', 1); // Forces sessions to only use cookies. 
ini_set('session.entropy_file', '/dev/urandom'); // better session id's
ini_set('session.entropy_length', '512'); // and going overkill with entropy length for maximum security

$cookieParams = session_get_cookie_params(); // Gets current cookies params.
session_set_cookie_params($cookieParams["lifetime"], $cookieParams["path"], $cookieParams["domain"], $secure, $httponly); 
session_name($session_name); // Sets the session name to the one set above.
session_start(); // Start the php session

Esto se usará con SSL por motivos de desarrollo, no es ...

Entonces, mi pregunta es dónde puedo mejorar este script. ¿Me he perdido algo? ¿Qué debo ver en el siguiente ...?

    
pregunta TuKritical 19.11.2012 - 06:43
fuente

3 respuestas

2

Esto se ve bastante bien. No puedo ver ningún agujero deslumbrante, excepto por el hecho de que SSL (solo https) está desactivado, aunque mencionaste que se activará en la producción.

También puede consultar Seguridad de transporte estricto de HTTP (HSTS) y Content Security Policy (CSP) ( detalles / intro ) para mayor seguridad.

    
respondido por el Polynomial 19.11.2012 - 09:47
fuente
2

Además, puede "bloquear" la sesión a una dirección IP de cliente específica, lo que hace que el robo de sesión sea aún más difícil, pero hace que la "itinerancia" de ISP o ubicaciones para los usuarios sea casi imposible (el usuario tiene que volver a iniciar sesión).

    
respondido por el Manuel Faux 19.11.2012 - 11:23
fuente
2

Hay mucha configuración y no mucho código.

No tiene mucho sentido usar un generador de números aleatorios realmente bueno si no establece la marca de seguridad (pero supongo que va a cambiar esto para el sistema en vivo).

Sin embargo, hay algunos problemas aquí.

Primero, no dices en qué contexto se está ejecutando esto: en un servidor compartido, los datos de la sesión del controlador predeterminado generalmente serán accesibles por todos los vhosts. Incluso en un servidor dedicado, recomiendo configurar el controlador de sesison para restringir el acceso a las sesiones (por ejemplo, usar un controlador de base de datos, con un procedimiento almacenado para configurar / obtener la sesión según el ID y sin acceso directo a los datos subyacentes) .

A continuación, no hay nada aquí para lidiar con la fijación de la sesión. Realmente debería obligar a que el identificador de la sesión cambie cuando se crea la sesión (es decir, cuando está vacía, pero recuerde poner algo allí después de cambiar la identificación de la sesión) y cuando el usuario esté autenticado.

Otra advertencia es que el controlador predeterminado reutilizará las sesiones que hayan pasado su TTL (si aún no se ha recolectado basura).

El consejo de Polynomiial es una buena protección contra sslstripping.

Recomendaría intentar asociar una sesión con un dispositivo específico, pero a diferencia de Manuel Faux, sugeriría usar los primeros 16 bits de la dirección IPV4. De forma similar, la coincidencia entre el agente de usuario y la sesión proporciona una protección adicional (pero tenga en cuenta que Google Chrome puede actualizarse sobre la marcha, incluso a mitad de sesión).

¿Por qué está anulando la configuración del archivo ini en su código? Estos deben estar configurados en su archivo php.ini.

$cookieParams = session_get_cookie_params(); // Gets current cookies params.
session_set_cookie_params($cookieParams["lifetime"], $cookieParams["path"], $cookieParams["domain"], $secure, $httponly)

No tiene mucho sentido cambiar los parámetros de la cookie a los valores que ya tienen.

La otra cosa que falta en tu código es cualquier tipo de registro.

    
respondido por el symcbean 19.11.2012 - 12:43
fuente

Lea otras preguntas en las etiquetas