2010-07-06 24 views
22

cómo resolver:El identificador de sesión es demasiado largo o contiene caracteres inválidos, caracteres válidos son az, AZ, 0-9 y '-,'

Advertencia: session_start() [function.session de inicio ]: El ID de sesión es demasiado largo o contiene caracteres ilegales, los caracteres válidos son az, AZ, 0-9 y '-,' en ..... en la línea 3

Advertencia: session_start() [function.session -start]: No se pueden enviar cookies de sesión: los encabezados ya enviados por (salida iniciada en ......: 3) en ..... en la línea 3

Advertencia: session_start() [function.session-start ]: Lata No enviar limitador de caché de sesión - cabeceras ya enviado (la producción se inició en .....: 3) en ..... en la línea 3

+4

¿No tiene caracteres ilegales en su ID de sesión? – SilentGhost

+0

Por favor, muestre algunos códigos. –

Respuesta

14

echar un vistazo a este session_start() discussion para una solución alternativa:

session_start() generar un aviso si PHPSESSID contiene caracteres no válidos

advertencia: session_start() [function.session-start]: El identificador de sesión contiene caracteres no válidos, caracteres válidos son az, AZ, 0-9 y '- , 'en /home/para/dev/mon_site/header.php en la línea 17

Para evitar que escribí esto:

<?php 
     function my_session_start() 
     { 
      if (ini_get('session.use_cookies') && isset($_COOKIE['PHPSESSID'])) { 
       $sessid = $_COOKIE['PHPSESSID']; 
      } elseif (!ini_get('session.use_only_cookies') && isset($_GET['PHPSESSID'])) { 
       $sessid = $_GET['PHPSESSID']; 
      } else { 
       session_start(); 
       return false; 
      } 

      if (!preg_match('/^[a-z0-9]{32}$/', $sessid)) { 
       return false; 
      } 
      session_start(); 

      return true; 
     } 
    ?> 
+8

¿Cómo terminas con los caracteres ilegales en 'PHPSESSID' en primer lugar? ¿No son generados por PHP automáticamente? –

+12

Lo son, pero una cookie que lo vincula a una identificación de sesión generada es del lado del cliente. Si esa cookie cambia a un formato no válido (alguien está tratando de explotar algo) PHP lo notará. –

+0

Una buena pista, pero si alguien está confiando en la funcionalidad session_autostart ... ¿cómo anular la función session_start() con la que estás sugiriendo aquí? – kante

38

Es una vulnerabilidad, un atacante malintencionado puede alterar las galletas y asigna caracteres ilegales a PHPSESSID para exponer esta advertencia PHP, que de hecho contiene información jugosa como el ruta de archivo y el nombre de usuario!

+1

Gran respuesta.^ –

+0

Mis sesiones parecen estar bajo este tipo de "investigación", aprecio que esta es una respuesta anterior, pero ¿tiene alguna indicación sobre cómo bloquear esta información? Mi registro de errores solo está abierto al lado del servidor en lugar de a una red más amplia. ¿Necesito/debo hacer más? – Martin

+2

Más información: https://www.owasp.org/index.php?title=Full_Path_Disclosure – Marek

5

Sugiero usar la versión "más correcta" de la función.

Varias notas:

  1. Más correcta expresión regular (permite caracteres en el rango de a-z A-Z 0-9, (coma) y - (menos)) como se describe here.
    La expresión regular depende de la configuración de php ini, como se describe here y here.
  2. Uso método de nombre de la sesión

versión actualizada Así se ve así:

<?php 
    function my_session_start() 
    { 
     $sn = session_name(); 
     if (isset($_COOKIE[$sn])) { 
      $sessid = $_COOKIE[$sn]; 
     } else if (isset($_GET[$sn])) { 
      $sessid = $_GET[$sn]; 
     } else { 
      session_start(); 
      return false; 
     } 

     if (!preg_match('/^[a-zA-Z0-9,\-]{22,40}$/', $sessid)) { 
      return false; 
     } 
     session_start(); 

     return true; 
    } 
?> 
11

I editado Andron's previous solution! (corregir el valor devuelto) y agregó la salida de evaluación de my_session_start(). La solución anterior resuelve un problema con un mensaje de error, pero necesito iniciar la sesión.

/** 
* @return boolean return TRUE if a session was successfully started 
*/   
function my_session_start() 
{ 
     $sn = session_name(); 
     if (isset($_COOKIE[$sn])) { 
      $sessid = $_COOKIE[$sn]; 
     } else if (isset($_GET[$sn])) { 
      $sessid = $_GET[$sn]; 
     } else { 
      return session_start(); 
     } 

    if (!preg_match('/^[a-zA-Z0-9,\-]{22,40}$/', $sessid)) { 
      return false; 
     } 
     return session_start(); 
} 

if (!my_session_start()) { 
    session_id(uniqid()); 
    session_start(); 
    session_regenerate_id(); 
} 
2

Si no se preocupan por otros usuarios (por ejemplo: si se trata de una interfaz privada), simplemente se echa navegador, encontrar la PHPSESSID cookie (o el nombre que le dio), se elimina, y la actualización .

+0

¡Esto me salvó, gracias! – Jordan

12

Hay un informe de error para este problema (https://bugs.php.net/bug.php?id=68063)

puede comprobar el éxito de su session_start y generar el id si es necesario:

$ok = @session_start(); 
if(!$ok){ 
session_regenerate_id(true); // replace the Session ID 
session_start(); 
} 
+0

me funciona, avíseme si el guión está guardado o es melódico. –

2

Vine con hasta este sencillo método, simplemente intente capturar el inicio de la sesión y, si hay un problema, regenere la sesión.

try { 
    session_start(); 
} catch(ErrorExpression $e) { 
    session_regenerate_id(); 
    session_start(); 
} 
+0

No puede detectar advertencias con try-catch. – swordsecurity

Cuestiones relacionadas