2010-07-06 4 views
22

Comment résoudre:L'identifiant de session est trop long ou contient des caractères illégaux, des caractères valides sont az, AZ, 0-9 et '-,'

Warning: session_start() [function.session-start ]: L'ID de session est trop long ou contient des caractères non autorisés, les caractères valides sont az, AZ, 0-9 et '-' dans ..... sur la ligne 3

Avertissement: session_start() [function.session -start]: Impossible d'envoyer un cookie de session - en-têtes déjà envoyés par (sortie commencée à ......: 3) dans ..... sur la ligne 3

Attention: session_start() [function.session-start ]: Pouvez pas envoyer limiteur de cache de session - déjà envoyés (en-têtes de sortie a commencé à .....: 3) ..... en ligne 3

+4

ne pas avoir de caractères illégaux dans votre ID de session? – SilentGhost

+0

S'il vous plaît montrer du code. –

Répondre

14

un coup d'oeil à ce session_start() discussion pour un travail autour:

session_start() génère un avertissement si PHPSESSID contient des caractères illégaux

Warning: session_start() [function.session-start]: L'identifiant de session contient des caractères illégaux, des caractères valides sont az, AZ, 0-9 et « - , dans /home/para/dev/mon_site/header.php à la ligne 17

Pour éviter que j'ai écrit ceci:

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

Comment vous retrouver avec des caractères illégaux dans 'PHPSESSID' en premier lieu? Ne sont-ils pas générés automatiquement par PHP? –

+12

Ils le sont, mais un cookie qui vous relie à un identifiant de session généré est côté client. Si ce cookie passe à un format invalide (quelqu'un essaie d'exploiter quelque chose) PHP le remarquera. –

+0

Bon indice, mais si quelqu'un se fie à la fonctionnalité session_autostart ... comment surcharger la fonction session_start() avec celle que vous suggérez ici? – kante

38

Il est une vulnérabilité de l'information, un attaquant malveillant peut modifier les biscuits et attribue des caractères illégaux PHPSESSID pour exposer cet avertissement PHP, qui contient en fait des informations juteuses comme chemin du fichier et le nom d'utilisateur!

+1

Bonne réponse.^ –

+0

Mes sessions semblent être sous ce genre de "enquête", j'apprécie c'est une vieille réponse, mais auriez-vous des indications sur la façon de verrouiller cette information? Mon journal d'erreurs n'est ouvert que sur le serveur plutôt que sur le web. Ai-je besoin de faire plus? – Martin

+2

Plus d'infos: https://www.owasp.org/index.php?title=Full_Path_Disclosure – Marek

5

Je suggère d'utiliser la version "plus correcte" de la fonction.

Plusieurs notes:

  1. Plus correcte expression régulière (caractères permet dans la gamme a-z A-Z 0-9, (virgule) et - (moins)) comme décrit here.
    L'expression régulière dépend des paramètres PHP ini, comme décrit here et here.
  2. Utiliser la méthode de nom de session

la version mise à jour Alors ressemble à ceci:

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

J'édité Andron's previous solution! (correction de la valeur renvoyée) et ajouté la sortie d'évaluation de my_session_start(). Solution précédente résoudre le problème avec un message d'erreur, mais j'ai besoin de démarrer la session.

/** 
* @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 vous ne se soucient pas d'autres utilisateurs (par exemple: si elle est une interface privée), juste vous vérifier navigateur, trouvez le cookie PHPSESSID (ou le nom que vous avez donné), supprimez-le, et l'actualisation .

+0

Cela m'a sauvé, merci! – Jordan

12

Il y a un rapport de bogue pour ce problème (https://bugs.php.net/bug.php?id=68063)

Vous pouvez vérifier le succès de votre session_start et de générer l'ID si nécessaire:

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

cela fonctionne pour moi, laissez-moi savoir si le script est enregistré ou mélodieux? –

2

Je suis venu avec cette méthode simple, il suffit essayer et attraper le début de la session, et s'il y a un problème régénérer la session.

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

Vous ne pouvez pas détecter les avertissements avec try-catch. – swordsecurity

Questions connexes