Ist es sicher, json_decode bei Benutzereingaben aufzurufen?

Lesezeit: 5 Minuten

Benutzer-Avatar
Fabrício Matté

Ich speichere ein JSON-codiertes Array von Integer-Indizes => Integer-Werte in einem Cookie.

Offensichtlich können Cookies wie jede andere Benutzereingabe leicht manipuliert werden, also hier ist meine Cookie-Getter-Validierung:

if ($_COOKIE['myCookie']) { //if cookie exists
    $myCookie = json_decode($_COOKIE['myCookie'], true);
    if (!is_array($myCookie)) { //in case decoding fails or bad cookie
        $myCookie = array(); //sets it as empty array
    }
} else { //if cookie doesn't exist, uses an empty array instead
    $myCookie = array();
}

Bevor ich dann einen der Werte verwende, überprüfe ich, ob er im Array vorhanden ist, und teste ihn anhand einer Liste von Werten auf der weißen Liste. Dieser Teil scheint ziemlich sicher zu sein, aber ich poste ihn, da er Teil der Validierung ist:

if (!empty($myCookie[$index])) { //checks if index exists and is truthy
    if ($myCookie[$index] !== 1 && $myCookie[$index] !== 2) { //values whitelist
        die('Hacking attempt through cookies exploit.');
    }
    //use the cookie data now
}

Zurück zur Frage, ist es sicher anzurufen json_decode direkt auf dem Keks? Können Benutzer das Cookie manipulieren, um beliebigen Code auszuführen?

Ich habe bisher viele Themen zu SO gelesen und was ich gefunden habe, ist das unserialize() ist unsicher abgeblendet, weil es Konstruktoren aufruft, aber json_decode ist technisch sicher. Ich habe ihre php.net-Seiten durchgelesen, aber diese sprechen die Sicherheit nicht direkt an.

Mein Addon erreicht sehr bald die Live-Beta, also frage ich mich, ob ich anrufe json_decode direkt auf dem Cookie sicher genug ist oder ob ich vor dem Anruf eine Art Validierung durchführen sollte json_decode. Ich könnte ein laufen preg_match auch, aber da ich vor der Verwendung gegen eine Whitelist von Werten teste, sollte es kein Problem geben, es sei denn json_decode führt irgendwie willkürlichen Code aus, was nicht der Fall ist, oder?

ich weiß das json_encode kehrt zurück NULL wenn es kein gültiges JSON ist, aber ich frage mich, ob dies der richtige Ansatz ist oder sollte ich vor dem Anruf eine Art Validierung hinzufügen json_decode?

  • Wer das ausnutzen kann, kann Ihren Code wahrscheinlich auf andere bizarre Weise hacken, an die Sie, ich und der Rest der Welt nie gedacht haben

    – Itay Moav-Malimovka

    6. September 2012 um 2:07 Uhr

  • @ItayMoav Danke für den Anreiz. =] Ich habe es einfach nie benutzt json_decode auf Benutzereingaben zuvor, und anscheinend gibt es keine Möglichkeit, diese Art von Daten außerdem zu validieren json_decode selbst, das zurückkehrt NULL wenn es fehlschlägt, denke ich.

    – Fabrício Matté

    6. September 2012 um 2:09 Uhr


  • Wenn Sie Bedenken hinsichtlich der Integrität von Daten in Cookies haben, sollten Sie diese mit einem HMAC signieren und den HMAC überprüfen, bevor Sie ihn verwenden. Verwenden Sie dafür eine Bibliothek oder lassen Sie es ein Framework tun, es ist wahnsinnig schwer, es selbst richtig zu machen !!!

    – MauganRa

    29. August 2016 um 14:57 Uhr

Verwenden json_decode die Benutzereingabe direkt zu entschlüsseln, hat kein Sicherheitsproblem.

Es ist nur eine Zeichenfolgenanalyse, es wird keine Zeichenfolgenauswertung durchgeführt.

json_decode in PHP ist wie JSON.parse in Javascript, und beide könnten direkt bei der Benutzereingabe verwendet werden, sie sind zum Zeitpunkt der Dekodierung sicher.

Aber nach der Dekodierung müssen Sie die Daten für Ihre Anforderung validieren.

  • Also ist es im Grunde nur String-Parsing, keine versteckte Hexerei dahinter? Danke für die Information. =] Ich war wohl etwas zu paranoid.

    – Fabrício Matté

    6. September 2012 um 2:21 Uhr

  • Um weitere Einblicke zu geben, wie dies missbraucht werden könnte, sehen Sie sich diesen Exploit in Magento an: karmainsecurity.com/KIS-2016-02 Dies ist die Art von Dingen, nach denen Sie suchen müssen, wenn Sie JSON decodieren und die Ergebnisse durch Ihren Code laufen lassen.

    – Tyler V.

    8. Dezember 2017 um 0:07 Uhr

Benutzer-Avatar
Hamisch

Insofern, als json_decode korrekt implementiert ist, sollte es sicher sein, es einfach ohne zusätzliche Vorverarbeitung zu verwenden (tatsächlich könnte das schlimmer sein, da Sie möglicherweise Fehler in Ihrem Vorprozessor haben).

  • Können Sie “korrekt implementiert” definieren? Ich gehe davon aus, dass PHP 5.4+ nativ ist json_decode korrekt implementiert ist. Über die Vorverarbeitung würde ich nichts tun, außer a auszuführen preg_match um nach verdächtigen Daten zu suchen, aber die json_decode selbst wird zurückkehren NULL Wenn die Dekodierung fehlschlägt und ich die Werte mit einer Whitelist überprüfe, sollte dies nicht erforderlich sein, oder?

    – Fabrício Matté

    6. September 2012 um 2:17 Uhr


  • “korrekt implementiert”, da es keine Fehler enthält, die es einem Angreifer ermöglichen könnten, einen Exploit einzuschleusen. Ja, es sollte NULL zurückgeben – was noch wichtiger ist – es sollte beim Deserialisieren nichts Gefährliches tun.

    – Hamisch

    6. September 2012 um 3:11 Uhr

  • Habe übrigens gerade meinen Tippfehler bemerkt. Mit gewesen sein sollte ohne. Dh, nicht nichts tun, bevor Sie zu gehen json_decode.

    – Hamisch

    6. September 2012 um 3:12 Uhr

  • Ja, ich dachte es wäre ein Tippfehler. +1 würde seit damals wünschen, ich könnte mehr als eine akzeptierte Antwort haben. Akzeptierte die Antwort von xdazz, da er die Funktionsweise ein wenig erläutert und erklärt, warum eine Vorverarbeitung nicht erforderlich ist.

    – Fabrício Matté

    6. September 2012 um 3:18 Uhr

json_decode schlägt fehl, wenn die Daten nicht im JSON-Format vorliegen, und gibt andernfalls ein nettes Array zurück, mit dem Sie arbeiten können. Wie Itay sagte, wenn jemand dies ausnutzen kann, verdient er es fast, hineinzukommen. json_decode leidet nicht unter dem Risiko von SQL, also würde ich sagen, dass Sie damit einverstanden sind.

Stellen Sie einfach sicher, dass Sie alles (oder eine weiße Liste, wie Sie es bereits sind) bereinigen, bevor Sie es in eine Abfrage integrieren.

  • Hat nicht viel zu dem beigetragen, was ich bereits wusste, aber es ist immer gut zu hören, was ich mit einer anderen Stimme denke. =]

    – Fabrício Matté

    6. September 2012 um 2:19 Uhr


1187130cookie-checkIst es sicher, json_decode bei Benutzereingaben aufzurufen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy