Sabine: register_globals off

Hallo!
mein session_start Script das bei jeder Seite aufgerufen wird lautet:

$sessionName = "sid";
session_name(isset($sessionName) ? $sessionName :session_name());
ini_set('session.gc_maxlifetime', '3600');
session_start();

nun meine Frage an Euch: wie muß ich das Script unter register_globals off schreiben, und bitte auch den Hintergrund.

LG! Sabine

  1. Hallo,

    $sessionName = "sid";
    session_name(isset($sessionName) ? $sessionName :session_name());

    ----------------^ überflüssige Überprüfung, da Du es eine Zeile darüber bereits gesetzt hast.

    ini_set('session.gc_maxlifetime', '3600');
    session_start();

    nun meine Frage an Euch: wie muß ich das Script unter
    register_globals off schreiben, und bitte auch den Hintergrund.

    Ich sehe keine Verwendung von irgendwelchen GET o. POST Parameter,
    daher dürfte sich m.E. die Änderungen (on->off) nicht auf diese
    Codestelle auswirken.

    Maria

  2. Moin!

      
    
    > $sessionName = "sid";  
    > session_name(isset($sessionName) ? $sessionName :session_name());  
    
    // Naja, man kann es kompliziert machen.  
    // PHP hat standardmäßig einen Session-Namen definiert, den man mit session_name() erfährt.  
    // Wenn man einen anderen Namen will, setzt man den mit session_name("sid").  
    // Das Gehampel mit isset($sessionName) ist irgendwie überflüssig.  
      
    
    > ini_set('session.gc_maxlifetime', '3600');  
    > session_start();  
    
    

    nun meine Frage an Euch: wie muß ich das Script unter register_globals off schreiben, und bitte auch den Hintergrund.

    Da muß nichts geändert werden.

    Folglich gibts auch keinen Hintergrund.

    - Sven Rautenberg

    --
    My sssignature, my preciousssss!
  3. Wäre nett wenn mir das mit den Session mal jemand erklären kann. Komme da nicht ganz klar damit.
    Auch der Code ist mir nicht ganz klar:

    if(!session_is_registered(s_UID)) { session_register(s_UID); }
    if(!session_is_registered(s_UserInfo)) { session_register(s_UserInfo); }

    // Check SessionID, set new one if fails
    if (strlen(session_id()) != 32)
     {
          if($GLOBALS['DEBUG'])
              { echo "False session-id found!<br>"; }
          mt_srand ((double)microtime()*1000000);
             session_id(md5(uniqid(mt_rand())));
     }

    LG! Sabine

    1. Moin!

      Wäre nett wenn mir das mit den Session mal jemand erklären kann. Komme da nicht ganz klar damit.

      Sessions in PHP sind eigentlich recht einfach:

      Der Befehl session_start() (nach Möglichkeit am Skriptanfang gegeben) generiert dir das Array $_SESSION mit allen bislang in der Session gespeicherten Inhalten.

      Innerhalb des Skriptes kannst du jetzt lesend und schreibend auf das Array zugreifen und beliebig auch neue Werte einfach anlegen, indem du sie ganz normal erzeugst:

        
      $_SESSION['neuer_wert'] = "Ich bin der neue Wert";  
      
      

      Am Skriptende speichert PHP den Inhalt dieses Arrays automatisch ab und wird es beim nächsten session_start() in einem Skript (mit derselben Session-ID) wiederherstellen.

      Deine Aufgabe ist also nur, alle Werte, die als Session-Variable über die Skripte hinweg erhalten bleiben sollen, nicht als normale Variable $wert zu schreiben, sondern als Session-Variable $_SESSION['erhaltenbleiben'].

      Ja, das ist etwas mehr Tipparbeit, weil man immer die eckigen Klammern, die Anführungsstriche (doppelte würden auch gehen, das nur am Rande bemerkt) und das lästige $_SESSION extra schreiben muß, aber es macht im Programmtext auch viel deutlicher, dass du hier auf eine Session-Variable zugreifst. Andererseits sind Session-Variablen in der Regel eher typische Werte-Speicher, die einmal gesetzt und dann nur regelmäßig wieder ausgelesen werden, man arbeitet aber nicht sonderlich häufig mit ihnen. Also fällt die Extra-Tipparbeit auch nicht so extrem aus.

      Auch der Code ist mir nicht ganz klar:

      Der Code ist schrecklich veraltet.
      1. Er benutzt nicht $_SESSION
      2. Er benutzt session_register() und session_is_registered() - beides soll auf den Müll nach Aussage der PHP-Hersteller.

        
      
      > if(!session_is_registered(s_UID)) { session_register(s_UID); }  
      
      // Wenn die Variable s_UID nicht als Session-Variable registriert ist, dann registrieren.  
      
      > if(!session_is_registered(s_UserInfo)) { session_register(s_UserInfo); }  
      
      // Wenn die Variable s_UserInfo nicht registriert ist, dann registrieren.  
      // Anzumerken ist, dass alle vier Funktionsaufrufe falsch sind. Die Variablennamen gehören zwingend in Anführungszeichen - es sei denn, im Skript wurden Konstanten definiert, denen Strings zugewiesen wurden, welche die Variablennamen enthalten, die hier registriert werden sollen - wovon ich nicht ausgehe.  
        
      
      > // Check SessionID, set new one if fails  
      > if (strlen(session_id()) != 32)  
      
      // Es wird geprüft, ob die Session-ID 32 Zeichen lang ist. Wenn nicht...  
      
      >  {  
      >       if($GLOBALS['DEBUG'])  
      >           { echo "False session-id found!<br>"; }  
      >       mt_srand ((double)microtime()*1000000);  
      >          session_id(md5(uniqid(mt_rand())));  
      
      // wird hier eine neue Session-ID gesetzt, die aus einem Zufallswert ermittelt wird.  
      // Das Problem hier ist, dass der Aufruf von session_id() zum Setzen einer neuen ID nur funktioniert, _bevor_ session_start() aufgerufen wurde. Das passiert aber implizit schon weiter oben im Code, wenn session_register() aufgerufen wird.  
      
      >  }  
      
      

      Unter dem Strich kann man sagen: Dein angegebener Code ist absoluter Müll, weil er erstens die veralteten und nur bei "register_globals=on" funktionierenden Funktionen aufruft, und dies zweitens auch noch in einer Weise tut, die falsch ist.

      Einen äquivalenten, modernen Code anzugeben fällt schwer:

        
      // Statt  
      session_is_registered('variable')  
      // nimm  
      isset($_SESSION['variable'])  
        
      // Statt  
      $variable = "wert";  
      session_register('variable')  
      // nimm  
      $_SESSION['variable'] = "wert";  
      
      

      Und diese Prüfung und ggf. Neugenerierung der Session-ID halte ich auch für überflüssig. PHP selbst generiert bei Abwesenheit einer Session-ID automatisch eine zufällige ID, deren Zufälligkeit man vertrauen kann. Warum in deinem Code geprüft wurde, ob die ID 32 Zeichen lang ist, kan nich nicht sagen - zwingend vorgeschrieben ist die Länge einer Session-ID jedenfalls nicht, der Mechanismus funktioniert auch mit nur einem Zeichen. Er ist auch von außen beeinflussbar, aber das sollte eigentlich zu keinen Nachteilen führen - denn wenn man sich eine ein Zeichen lange Session-ID ausdenken kann, kann man auch eine 32 Zeichen lange ID ausdenken. Beides ist ungefährlich, so lange man dabei nicht eine ID wählt, die aktuell schon woanders genutzt wird - was bei den absichtlich kurz gewählten IDs sehr unwahrscheinlich sein dürfte, da PHP solche IDs nicht generiert, und kein zufälliger Nutzer so eine ID abkriegen dürfte.

      Hinsichtlich der Gültigkeitsdauer einer Session noch eine Anmerkung: PHP regelt die Zeitdauer nicht streng auf die Sekunde. Die Angabe zur maximalen Lebenszeit der Session ist genau genommen die minimal garantierte Lebenszeit der Session. Nach Ablauf dieser Zeitspanne wird die Session-Datei, welche die Inhalte des Arrays $_SESSION enthält, als löschbar betrachtet. PHP löscht aber nicht bei jedem Skriptaufruf im Hintergrund alle abgelaufenen Sessions, sondern nur bei rund jedem hundersten Skriptaufruf. Auf Servern, die sehr viele Zugriffe haben, führt das wie gewünscht dazu, dass die Session schon kurze Zeit nach ihrer Lebensdauer tatsächlich gelöscht wird. Auf Servern mit wenigen Zugriffen hingegen wird die Session erheblich länger existieren.

      Wenn man das absichern und verhindern will, muß man in den Session-Werten einfach den Zeitpunkt des letzten Zugriffs speichern und beim erneuten Aufruf vergleichen, ob der Zeitraum zwischen Session-Zeit und aktueller Zeit schon zu groß ist und die Session deshalb abgelaufen.

      - Sven Rautenberg

      --
      My sssignature, my preciousssss!