Deutsch English
WordPress Read this post in English

Session-Variablen in WordPress

Drei Tage lang wäre ich fast verzweifelt, als ich eine WordPress-Seite um ein selbstgeschriebenes Login-Script erweitern wollte. Lokal funktionierte alles einwandfrei, doch sobald ich es hochgeladen hatte, schienen die Session-Variablen nicht mehr übernommen zu werden: nach dem Login war man jeweils einen Klick lang eingeloggt und danach sofort wieder ausgeloggt.

Nach etlichen erfolglosen Google-Suchen (im Nachhinein googelt es sich ganz leicht danach, aber versucht mal was dazu zu finden, nachdem Ihr nicht weiter als bis hierher gelesen habt) fand ich endlich die Ursache, nämlich die Funktion wp_unregister_GLOBALS() in der Datei wp-settings.php. Hier ist sie:

26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
function wp_unregister_GLOBALS() {
    if ( !ini_get('register_globals') )
        return;
 
    if ( isset($_REQUEST['GLOBALS']) )
        die('GLOBALS overwrite attempt detected');
 
    // Variables that shouldn't be unset
    $noUnset = array('GLOBALS', '_GET', '_POST', '_COOKIE', '_REQUEST', '_SERVER', '_ENV', '_FILES', 'table_prefix');
 
    $input = array_merge($_GET, $_POST, $_COOKIE, $_SERVER, $_ENV, $_FILES, isset($_SESSION) && is_array($_SESSION) ? $_SESSION : array());
        foreach ( $input as $k => $v )
            if ( !in_array($k, $noUnset) && isset($GLOBALS[$k]) ) {
                $GLOBALS[$k] = NULL;
                unset($GLOBALS[$k]);
            }
}

Was macht diese Funktion?

  • Zeile 27/28:
    Wenn auf dem Webserver die PHP-Einstellung register_globals nicht aktiviert ist, dann macht sie überhaupt nichts (daher auch die unterschiedlichen Verhaltensweisen meines Scripts auf meinem lokalen und dem Live-Server). Ist register_globals jedoch aktiv, geht es folgendermaßen weiter:
    • Zeile 34:
      Wie der Kommentar schon sagt, werden hier alle globalen Variablen aufgelistet, die nicht resettet werden sollen. Wie man sieht, ist $_SESSION nicht dabei!
    • Zeile 36–41:
      Nun werden nacheinander alle globalen Variablen durchgegangen und gelöscht.

Kurz gesagt: Wenn register_globals aktiviert ist, wird $_SESSION bei jedem Seitenaufruf gelöscht. Kein Wunder also, daß man nicht mehr an seine Session-Variablen rankommt!

Wozu das Ganze?

Nun ja, zum einen geht WordPress davon aus, daß es sich komplett um jeden Bereich der Seite kümmern soll – schließlich ist es ja eine Art von Content-Management-System. Und das beinhaltet eben auch, daß es die Verwaltung sämtlicher Variablen übernimmt.

Was aber noch viel wichtiger ist, ist die Tatsache, daß die Verwendung von register_globals längst veraltet ist und das Feature mit PHP 6 sogar komplett entfernt wird. Von der Programmierung mit solchen Variablen wird inzwischen überall abgeraten, da sie Sicherheitsrisiken birgt. WordPress versucht also offensichtlich, das Verhalten von deaktiviertem register_globals nachzuahmen, um die Sicherheit zu erhöhen und eventuelle Variablenkonflikte zu vermeiden.

Abhilfe

Nachdem ich erst einmal hinter dieses Rätsel gekommen war, lag die Lösung natürlich auf der Hand: Ich muß register_globals auf dem Webserver deaktivieren, damit WordPress diese bescheuerte Funktion gar nicht erst auszuführen braucht. Dazu lädt man einfach in sein WordPress-Verzeichnis eine Textdatei namens php.ini hoch, in der die folgende Zeile steht:

register_globals Off

Weitere Informationen zum Thema gibt es auf php.net:


Weitersagen

Anzeige


Kommentare

1 5 6 7

  1. 14. Mai 2012
    21:20 Uhr

    Wayan Wirka flag

    Many many thank you. Your solution is works. I has been googling for a long time but I got nothing. Thank you,
    Wirka

  2. 2. April 2012
    10:06 Uhr

    Robin C. flag

    Great solution, thanks for posting! And nice design of your blog ;-)

  3. 16. März 2012
    8:04 Uhr

    vosmer flag

    You rock man. I’ve spent half a day before found you article looking for problem with wp e-commerce paypal feed. Vielen Dank!

  4. 29. Januar 2012
    10:58 Uhr

    Dinesh Karki flag

    It worked. Thank you so much. And special thanks for explanation. :)

  5. 12. Dezember 2011
    4:57 Uhr

    jhr flag

    UBER find +1

    The plugin I’ve inherited has their variable safe in $no_unset in wp-includes/load.php …

    but I was still having to login

    Thanks a million…

  6. 10. November 2011
    10:34 Uhr

    Satheesh Kumar R flag

    Wow…..

    Great solution man…
    Thanks a lot….after 3.30hrs research in my coding and google…
    U saved me from the hell…

  7. 4. Oktober 2011
    11:38 Uhr

    P Stuetzer

    Thanks man, you saved my day, this was a pain in the ass!!

  8. 12. September 2011
    15:55 Uhr

    Riho flag

    You just saved my day!!!

  9. 10. August 2011
    22:13 Uhr

    Sandip Das flag

    Great man, your suggestion save my projects, Thank a lot

  10. 6. Juli 2011
    21:14 Uhr

    Tilman flag

    Ist es eigentlich möglich die Session von wordpress zu einer anderen Seite, die auch auf dem Server läuft mitzunehmen? Also, so dass die Leute, die bei wordpress angemeldet sind auch auf dieser Seite angemeldet sind?

1 5 6 7

Kommentieren

Erlaubtes HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <p> <pre lang="" line="" escaped=""> <q cite=""> <strike> <strong> | Codeschnipsel können in `backticks` gepostet werden. Beispiel: `<?php echo "Hi!"; ?>`