Mysteriöses PHP Variablenhandling



  • Irgendwie verstehe ich nicht so ganz, was du mit dem Code willst 🙄
    Und wenn du session_register weglässt und $HTTP_SESSION_VARS['Name'] nie etwas zuweist kann er doch auch nichts ausgeben 😕



  • Eigentlich dürfte er selbst mit register_globals auf on nichts ausgeben! Tut er aber...

    Aber habe dann auch folgendes getestet:

    <?php
    
    session_start();
    
    if (isset($HTTP_SESSION_VARS['Name']))
    	echo 'Name: '.$HTTP_SESSION_VARS['Name'];
    
    echo '<a href="test.php">Nochmal</a>';
    
    $HTTP_SESSION_VARS['Name'] = 'Hallo!<br />';
    
    ?>
    

    Und der hat mir dann auch nie was ausgegeben... habe mir jetzt erstmal nen neuen Apache und PHP installiert, mal sehen, ob es damit geht.

    Danke trotzdem...



  • Du kannst dir ja mal jeweils mit session_id() die Session-ID ausgeben lassen - warscheinlich liegt hier schon der Fehler 🙄
    Warum darf er mit register_globals auf on nichts ausgeben 😕 - imho ist das doch völlig korrekt.
    Ansonsten: Warnungen und Fehler von PHP werden allg. schon ausgegeben (nicht deaktiviert), oder?



  • Hast du in deiner Funktion auch daran gedacht, $Name global zu machen?

    Ansonsten PHP-Session-Handling = Bäh! Lieber was manuelles benutzen (à la PHPLib o.ä.).



  • Bei

    <?php 
    
    session_start(); 
    session_register('Name'); 
    
    if (isset($HTTP_SESSION_VARS['Name'])) 
        echo 'Name: '.$HTTP_SESSION_VARS['Name']; 
    
    echo '<a href="test.php">Nochmal</a>'; 
    
    ?>
    

    dürfte nie etwas ausgegeben werden (außer der Link), da ich ja nie eine Session Variable setze. Trotzdem kann man hier durch übertragen einer Variable mit dem Namen 'Name' über POST oder GET die Variable $HTTP_SESSION_VARS['Name'] setzen. Das ist meiner Meinung nach ein riesiges Sicherheitsproblem!

    Das die andere Variante (ohne session_register) nicht ging, lag an meinem Server...



  • Wenn dem so ist, wüsste auch echo $Name eine Ausgabe hervorrufen (und somit eigentlich register_globals auf on sein)



  • Ob echo $Name etwas ausgibt oder nicht ist doch egal (und somit ist egal, ob register_globals auf on oder off steht), Tatsache ist, dass der Code den ich gerade gepostet habe etwas ausgibt, wenn ich eine Variable über GET oder POST einschleuse und das darf eigentlich nicht sein.



  • Öhm... Doch 🙄
    Wenn echo $Name dir schon was ausgibt (daraus folgt dann register_globals = On) dann ist es ganz normal, dass dein Code was ausgibt.

    Loggy schrieb:

    ...da ich ja nie eine Session Variable setze.

    Tust du doch mit session_register("Name")...



  • Ok, gehen wir mal davon aus, dass register_globals auf on ist (was nie der Fall sein sollte und bei mir auch nicht ist). Dann registriere ich durch session_register('Name') eine globale Variable $Name und gleichzeitig eine Variable $HTTP_SESSION_VARS['Name']. Da register_globals auf on ist, kann es passieren, dass $Name überschrieben wird. Meinetwegen durch die ebenfalls auch global vorhandene Variable $HTTP_POST_VARS['Name']. Das darf aber nicht dazu führen, dass der Inhalt von $HTTP_SESSION_VARS['Name'] geändert wird. Das würde ja sonst bedeuten, dass $HTTP_POST_VARS['Name'], $HTTP_SESSION_VARS['Name'] und $HTTP_GET_VARS['Name'] alle auf eine Variable zeigen. Dann könnte ich mir diese Arrays nicht nur sparen, sondern sie sind auch noch verwirrend, weshalb man sie weglassen müsste und vor jedem session_start erstmal eine Menge unsets einbauen, damit da keine Sicherheitslücke entsteht.

    Das komische ist aber, dass das Verhalten auch mit register_globals auf off entsteht (aber mit session_register, was man dann ja weglassen könnte, aber in alten Programmen eben noch drin ist).

    Oder reden wir aneinander vorbei?



  • Also vielleicht hab ich ja das Sessionmanagement von PHP völlig falsch verstanden (benutze das selbst nie), aber ich verstehe das so:

    Ok, wir gehen von reg_glob = on aus: Zu Beginn deines Scripts hast du eine Variable $Name. Diese hat nach der GPC-Regel automatisch den Wert der Get/Post/Cookie-Variable $HTTP_GET_VARS['Name'], $HTTP_POST_VARS['Name'] oder $HTTP_COOKIE_VARS['Name']. Zu dieser Zeit ist das Array $HTTP_SESSION_VARS noch leer. Nun rufst du session_register('Name') auf, wodurch dem Array $HTTP_SESSION_VARS ein Element namens Name hinzugefügt wird, das den aktuellen Wert der globalen Variable $Name (und somit den von $HTTP_POST_VARS['Name']) hat. Allerdings ist $HTTP_SESSION_VARS['Name'] KEIN Zeiger auf $Name, sondern eine Kopie davon.

    Oder reden wir aneinander vorbei?

    Kann gut sein... Ich hab noch nicht so 100%ig verstanden, was du machen willst, sondern nur, was du NICHT machen willst. 😉

    Bloops



  • das den aktuellen Wert der globalen Variable $Name (und somit den von $HTTP_POST_VARS['Name']) hat.

    Ja, kann gut sein, dass es so läuft. Meiner Meinung darf es aber nicht so laufen. Ich meine, es müsste so laufen.

    register_globals ist auf on, deswegen gibt es einge globale Variable $Name, die den Wert von GET/POST/COOKIE bekommen hat. Nun rufe ich session_register('Name') auf. Dann müsste das System nachschauen, ob in der bestehenden Session die Variable 'Name' existiert. Wenn das der Fall ist, soll die Variable $HTTP_SESSION_VARS['Name'] und die globale Variable $Name diesen Wert bekommen. Wenn die Variable in der Session noch nicht existiert, müsste $Name den alten Wert behalten (tut es auch) und HTTP\_SESSION\_VARS['Name'] müsste als "nicht gesetzt" markiert sein (also isset(HTTP_SESSION_VARS['Name']) müsste false ergeben). Aber genau das passiert nicht, sondern es wird mir vorgegaukelt, dass es schon eine bestehende Session mit der Variablen 'Name' gibt und diese den Wert der GET/POST/COOKIE Variable hat. Hier liegt meiner Meinung nach ein grober Fehler vor.



  • Ah, jetzt verstehe ich, was du meinst. Also ich würde es nicht als Fehler bezeichnen, sondern einfach als "anders". 😉

    mit session_register('Name') fügst du der Session und somit auch HTTP_SESSION_VARSautomatischdasElementNamehinzu(EgalobdaPostdrinistoderleerodersonstwas).Somitistklar,dassisset(HTTP\_SESSION\_VARS automatisch das Element Name hinzu (Egal ob da Post drin ist oder leer oder sonstwas). Somit ist klar, dass isset(HTTP_SESSION_VARS['Name']) immer true ist, wenn du es danach aufrufst, denn durch session_register() ist die Variable ja gesetzt (und wenn sie leer ist...).
    Du musst also VOR session_register() überprüfen, ob $HTTP_SESSION_VARS['Name'] gesetzt ist.
    Außerdem trennst du irgendwie in deinem Posting immer die "Variablen der Session" und die "Variablen in dem Array $HTTP_SESSION_VARS". $HTTP_SESSION_VARS ist die Session.
    Was genau willst du denn jetzt eigentlich machen?

    Loggy schrieb:

    Nun rufe ich session_register('Name') auf. Dann müsste das System nachschauen, ob in der bestehenden Session die Variable 'Name' existiert. Wenn das der Fall ist, soll die Variable $HTTP_SESSION_VARS['Name'] und die globale Variable $Name diesen Wert bekommen. Wenn die Variable in der Session noch nicht existiert, müsste $Name den alten Wert behalten (tut es auch) und HTTP\_SESSION\_VARS['Name'] müsste als "nicht gesetzt" markiert sein (also isset(HTTP_SESSION_VARS['Name']) müsste false ergeben).

    Meinst du das?

    function initialize_session_variable($var) //statt session_register() aufrufen
    {
    	if (isset($HTTP_SESSION_VARS[$var]))
    	{
    		$GLOBALS[$var] = $HTTP_SESSION_VARS[$var];
    	}
    }
    

    Bloops



  • Wenn eine Variable leer ist, dann muss isset($var) false ergeben. Wenn das true ergibt, heißt das, dass sie einen definierten Wert hat. Was du meinst ist

    bool session_is_registered   (string Name)
    

    .

    Das müsste also immer true ergeben, nachdem ich session_register aufgerufen habe. isset allerdings nur, wenn ich entweder der Variablen einen Wert zugewiesen habe oder ein Wert aus der Session Datei ausgelesen wurde.

    (Ich unterscheide zwischen $HTTP_SESSION_VARS und den Daten, die serialisiert werden. Anscheind ist das ja ein unterschied, denn es war kein Wert für 'Name' serialisiert und trotzdem hat $HTTP_SESSION_VARS['Name'] einen Wert, den ich aber nicht explizit gesetzt habe)

    Aber es ist jetzt egal, denn register_globals ist auf off (ich behaupte, dann ändert sich dieses Verhalten nicht) und ich benutze nicht mehr $HTTP_SESSION_VARS, sondern $_SESSION. Denn in dieser Variable ist auch nur das drin, was ich explizit gesetzt habe oder aus der Session File ausgelesen wurde.



  • Loggy schrieb:

    Wenn eine Variable leer ist, dann muss isset($var) false ergeben. Wenn das true ergibt, heißt das, dass sie einen definierten Wert hat.

    Nein. Was du meinst ist

    if(!empty($var))
    

    :p

    Hast du jetzt dein Problem geklärt?



  • Du hättest mal genauer in die PHP-Doku schauen sollen:

    Wenn Sie $_SESSION (oder $HTTP_SESSION_VARS) verwenden, sollten Sie nicht session_register(), session_is_registered() und session_unregister() verwenden.


Anmelden zum Antworten