2010-07-06 10 views
22

Wie lösen:Die Session-ID ist zu lang oder enthält ungültige Zeichen, gültige Zeichen sind az, AZ, 0-9 und '-'

Warning: session_start() [function.session-start ]: Die Sitzungs-ID ist zu lang oder enthält unzulässige Zeichen. Gültige Zeichen sind az, AZ, 0-9 und '-,' in ... in Zeile 3

Warnung: session_start() [function.session -start]: Session-Cookie kann nicht gesendet werden - Header bereits gesendet von (Ausgabe gestartet am ......: 3) in ..... in Zeile 3

Warnung: session_start() [function.session-start ]: Kann keine Sitzungscache senden - headers already (Ausgang bei gestartet .....: 3) geschickt in ..... auf Linie 3

+4

Haben Sie keine unzulässigen Zeichen in Ihrer Session-ID? – SilentGhost

+0

Bitte Code anzeigen. –

Antwort

14

haben einen Blick auf diese session_start() discussion für eine Behelfslösung:

session_start() erzeugen eine Warnung, wenn PHPSESSID ungültige Zeichen enthält

Warning: session_start() [function.session-start]: Die Session-ID enthält ungültige Zeichen sind gültige Zeichen az, AZ, 0-9 und ‚- 'in /home/para/dev/mon_site/header.php in Zeile 17

Um zu vermeiden, ich dies schrieb:

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

Wie kommt es, dass in "PHPSESSID" überhaupt illegale Charaktere landen? Werden sie nicht automatisch von PHP generiert? –

+12

Sie sind, aber ein Cookie, der Sie mit einer generierten Sitzungs-ID verbindet, ist Client-Seite. Wenn sich das Cookie in ein ungültiges Format ändert (jemand versucht etwas auszunutzen), wird PHP es bemerken. –

+0

Netter Tipp, aber wenn jemand auf Session_autostart-Funktionalität ... Wie überschreibt die Session_start() Funktion mit der, die Sie hier vorschlagen? – kante

38

Es ist ein Informations Verwundbarkeit, ein böswilliger Angreifer die Cookies verändern können, und weist ungültige Zeichen dieses PHP Warnung an PHPSESSID zu belichten, die in der Tat saftig Informationen wie die enthält Dateipfad und der Benutzername!

+1

Große Antwort.^ –

+0

Meine Sitzungen scheinen unter dieser Art von "Untersuchung" zu stehen, ich weiß, dass dies eine alte Antwort ist, aber hätten Sie irgendwelche Hinweise, wie Sie diese Informationen sperren können? Mein Fehlerprotokoll ist nur für die Serverseite offen und nicht für ein breiteres Web. Muss/sollte ich mehr tun? – Martin

+2

Weitere Informationen: https://www.owasp.org/index.php?title=Full_Path_Disclosure – Marek

5

Ich empfehle, "korrekter" Version der Funktion zu verwenden.

Mehrere Hinweise:

  1. Korrektere regulärer Ausdruck (ermöglichen Zeichen im Bereich a-z A-Z 0-9, (Komma) und - (minus)) als here beschrieben.
    Regulärer Ausdruck hängt von den php ini Einstellungen ab, wie beschrieben here und here.
  2. Verwenden Sitzungsname Methode

sieht so aktualisierte Version wie folgt aus:

<?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 edited Andron's previous solution! (fixed returned value) und die Evaluierungsausgabe von my_session_start() hinzugefügt. Vorherige Lösung löst Problem mit Fehlermeldung, aber ich muss die Sitzung gestartet haben.

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

Wenn Sie nicht über andere Benutzer kümmern (zB wenn es sich um eine private Schnittstelle ist), können Sie nur Browser überprüfen, finden das Cookie PHPSESSID (oder den Namen, den Sie es gab), löschen und refresh .

+0

Das hat mich gerettet, danke! – Jordan

12

Es gibt einen Fehlerbericht für dieses Problem (https://bugs.php.net/bug.php?id=68063)

Sie können den Erfolg Ihrer session_start überprüfen und die ID erzeugen, wenn nötig:

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

funktioniert es für mich, lass mich wissen, ob das Skript gespeichert oder melisch ist? –

2

Ich kam mit bis dieser einfachen Methode, einfach Versuchen Sie, den Sitzungsstart abzufangen, und generieren Sie bei einem Problem die Sitzung neu.

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

Sie können Warnungen nicht mit try-catch abfangen. – swordsecurity

Verwandte Themen