¿Existe una forma segura de compartir sesiones en el mismo servidor con subdominios diferentes?

1

Estoy estudiando un caso en el que tengo un backend REST (basado en php) y un front-end HTML + JS + PHP híbrido en diferentes subdominios:

backend.example.com  <-- A RESTful API to provide some XHR requests.
*.example.com  <--  Any other domains on the same server that use the same PHP Session.

Una forma de iniciar una sesión persistente en PHP sin la colocación de una cookie de sesión es crear su propio ID de sesión y configurarlo con la función session_id ().

De hecho, deshabilitar el almacenamiento de cookies de sesión no me permite mantener la sesión en los subdominios. Así que implementé una clase de administrador de sesión, para controlar el ciclo de vida de todas mis clases y permitir compartir la sesión entre subdominios:

   public static function sessionStart($name, $limit, $trusttoken){

            (...)

    $userip = $_SERVER['REMOTE_ADDR'];
    $userbrowseragent = $_SERVER['HTTP_USER_AGENT'];

    $id = md5($userip . $salt .  $userbrowseragent  . $sessionname); //Creating unique ID

    session_id($id);                
    session_start();

            (...)
   }

¿Es una forma segura de compartir sesiones en el mismo servidor pero usando diferentes subdominios?

Nota

  • Las sesiones se leerán solo en el lado del servidor (archivos PHP)
  • No me importa confiar en las solicitudes de XHR.
  • Evito exponer el ID de sesión en las solicitudes.
  • No es posible usar SSL.
pregunta LeonanCarvalho 30.10.2014 - 20:41
fuente

1 respuesta

2

Una aplicación debe confiar en el controlador de sesión de la plataforma. Rodar tu propio controlador de sesión es peligroso.

Una cookie puede tener un ámbito para el dominio principal y ser utilizada por cada subdominio. En PHP, esto se puede hacer con session_set_cookie_params () para cambiar el alcance del dominio codificar%. Luego usa *.example.com normalmente.

XSS en cualquier subdominio puede comprometer el ID de sesión. Asegúrese de habilitar los indicadores de cookie session_start() y Secure . Esto asegurará que HTTPS se utilizará con el ID de sesión para todas las solicitudes y limitará el impacto de XSS.

Además, generar un ID de sesión usando el siguiente método es inseguro :

$id = md5($userip . $salt .  $userbrowseragent  . $sessionname);

Nunca intentes rodar tu propio generador de números aleatorios. Un identificador de sesión debe ser un fuente criptográfica generada con un generador de números pseudoaleatorios seguro criptográficamente (CSPRNG). La función hash HTTPOnly nunca debe usarse en un contexto de seguridad, se ha roto desde 2005. Incluso si se usara una función hash segura, el atacante conoce el md5 , $userip y el $userbrowseragent , que significa que podrían aplicar fuerza bruta al valor $sessionname fuera de línea.

    
respondido por el rook 30.10.2014 - 20:50
fuente

Lea otras preguntas en las etiquetas