Ein Array über GET URL Parameter übergeben

Um ein Array oder ein Objekt über $_GET Parameter zu übergeben, lässt sich das Array am einfachsten serialisieren und dann mit base64 kodieren. Auf diese Weise kann es in keinem Browser zu einem Problem mit dem Objekt kommen.

Be careful here though. The maximum size of a GET request is limited to 4k, which you can easily exceed by passing arrays in a URL. ~ nash @stackoverflow

Warum nutze ich das base64 encoding? URLencode an sich ist eine große Platzverschwendung! Beispielsweise werden aus einem Zeichen drei – und wir haben ja nur 4k Platz. Verwendete man base64 allein, bliebe ein Problem mit drei Zeichen, die in der URL eine spezielle Funktion haben: +=/
Diese werden dann halt doch noch mit urlencode in valide Zeichen übersetzt. So spart man also Platz und ist dennoch auf der sicheren Seite!

Vielen Dank an Hannes Peterseim für den Tip mit der Base64 Kodierung!

4 Kommentare » Schreibe einen Kommentar

  1. Hallo,
    guter Tipp, allerdings muss man da höllisch aufpassen!
    unserialize() called „magic functions“ – __destruct, __wakeup z.B.

    Mit Worten schwer zu beschreiben, daher kurzer PoC:


    var2;
    }

    /*__destruct führt, das, was in der Variable $aaa ist, aus!
    Unter normalen Bedingungen stehen hier zB Funktionen, die dazu da sind um Log-Dateien zu schreiben oder Fehler auszugeben
    */
    public function __destruct() {
    eval($this->aaa);
    }

    }

    //... src ...//

    //Usereingaben
    $eingabe = $_GET['cmd'];

    $eingabe = unserialize($eingabe);

    $ob = new class_ausgabe();
    $ob->var_ausgabe();
    // bei unserialize wird __wakeup und __destruct ausgeführt - automatisch!
    // Wenn man nun den serialized string per get (oder post, server, cookie, je nachdem) übergibt:
    // O:13:"class_ausgabe":1:{s:3:"aaa";s:10:"phpinfo();";}
    // wird die Variable "aaa" gesetzt, ihr inhalt ist "phpinfo();"
    // das kommt ins eval, und wird dann ausgeführt

    ?>

    PIWIK und diverse andere bekannte Webanwendungen hatten damit Probleme und es gab einige schöne Exploits, die dieses Verhalten ausgenutzt haben!
    Bei Arrays ist das nicht der Fall, aber wenn man irgendwie einen serialized string, der unserialized ein object ist überträgt, muss man dieses Verhalten beachten. Wenn man keine wakeups und destructs nutzt bzw. richtig nutzt, dann ist das natürlich kein Problem ;)

    Viel Spaß!

  2. Dazu muss man aber schon __destruct() selbst im eigenen Skript benutzen, oder?

Schreibe einen Kommentar

Pflichtfelder sind mit * markiert.