2010-07-06 13 views
22

Come risolvere:l'ID di sessione è troppo lungo o contiene caratteri non validi, caratteri validi sono az, AZ, 0-9 e '-,'

Warning: session_start() [function.session-start ]: L'ID di sessione è troppo lungo o contiene caratteri non validi, i caratteri validi sono az, AZ, 0-9 e '-,' in ..... on line 3

Avviso: session_start() [function.session -start]: impossibile inviare cookie di sessione - intestazioni già inviate da (output avviato a ......: 3) in ..... on line 3

Avviso: session_start() [function.session-start ]: Può Non inviare sessione di limitatore di cache - headers already sent (uscita iniziato a .....: 3) in ..... on line 3

+4

non hanno caratteri non validi nel proprio ID di sessione? – SilentGhost

+0

Si prega di mostrare un po 'di codice. –

risposta

14

un'occhiata a questo session_start() discussion per un work-around:

session_start() generare un avviso se PHPSESSID contiene caratteri non validi

Warning: session_start() [function.session-start]: l'ID di sessione contiene caratteri non validi, caratteri validi sono az, AZ, 0-9 e '- , 'in /home/para/dev/mon_site/header.php sulla linea 17

Per evitare ho scritto questo:

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

In primo luogo, come finisci con i caratteri non validi in 'PHPSESSID'? Non sono generati da PHP automaticamente? –

+12

Sono, ma un cookie che ti collega a un ID di sessione generato è lato client. Se quel cookie cambia in un formato non valido (qualcuno sta cercando di sfruttare qualcosa), PHP lo noterà. –

+0

Bel suggerimento, ma se qualcuno si affida alla funzionalità session_autostart ... come sostituire la funzione session_start() con quella che stai suggerendo qui? – kante

38

Si tratta di una vulnerabilità di informazioni, un malintenzionato può alterare i biscotti e assegna caratteri illegali per PHPSESSID per esporre questo avvertimento di PHP, che in realtà contiene informazioni succose come la percorso del file e il nome utente!

+1

Ottima risposta.^ –

+0

Le mie sessioni sembrano essere sotto questa sorta di "indagine", apprezzo che questa è una vecchia risposta, ma avresti qualche indicazione su come bloccare queste informazioni? Il mio registro degli errori è aperto solo sul lato server piuttosto che sul web più ampio, ho bisogno/dovrebbe fare di più? – Martin

+2

Ulteriori informazioni: https://www.owasp.org/index.php?title=Full_Path_Disclosure – Marek

5

Suggerisco di utilizzare la versione "più corretta" della funzione.

Diverse note:

  1. più corretto le espressioni regolari (permette caratteri nell'intervallo a-z A-Z 0-9, (virgola) e - (meno)), come descritto here.
    L'espressione regolare dipende dalle impostazioni di php ini, come descritto here e here.
  2. Utilizzare il metodo nome della sessione

versione aggiornata Così si presenta così:

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

ho modificato Andron's previous solution! (corregge il valore restituito) e ha aggiunto l'output di valutazione di my_session_start(). La soluzione precedente risolve il problema con il messaggio di errore, ma ho bisogno di avviare la sessione.

/** 
* @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

Se non si cura di altri utenti (ad esempio: se si tratta di un'interfaccia privata), basta controllare il tuo browser, trovare il PHPSESSID biscotto (o il nome assegnato), cancellarlo, e di aggiornamento .

+0

Questo mi ha salvato, grazie! – Jordan

12

C'è un bug report per questo problema (https://bugs.php.net/bug.php?id=68063)

è possibile verificare il successo della vostra session_start e generare l'ID, se necessario:

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

funziona per me, fammi sapere se la sceneggiatura è salvata o melicious? –

2

Sono venuto con un massimo questo metodo semplice, basta prova a prendere l'avvio della sessione e, se c'è un problema, rigenera la sessione.

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

Non è possibile rilevare gli avvisi con try-catch. – swordsecurity

Problemi correlati