dedlfix: GET = JSON oder SERIALIZE

Beitrag lesen

Tach!

Ich würde immer JSON nehmen.

  • serialize() hatte in den letzten Jahren einige Sicherheitslücken (Remote Code Execution).
  • Mit JSON bist du zukunftssicher, falls irgendwann mal eine Seite neu implementiert wird in nicht-PHP.

Das Beispiel, das ich fand, wird sich wohl nicht ganz verhindern lassen. Beim Unserialisieren werden eben auch Objekte von Klassen instantiiert, deren Name mit serialisiert wurde, und dabei wird ein vorhandenes __wakeup() ausgeführt. Der Code dazu muss sich aber bereits im Script befinden. Man kann so also unerwünschte Objekte bestimmter Klassen erstellen und deren __wakeup()-Code ausführen, wenn man die Daten von anderswo entgegennimmt und dabei dem Ersteller traut. Hat man kein __wakeup() in seinen Klassen und auch keine Bibliothek eingebunden, die sowas hat, dann passiert erstmal nichts weiter. Es passiert auch nichts Schlimmes, wenn in den __wakeup()s nichts weiter gravierendes steht. Es kann dann aber in der Folge zu ungewünschtem Verhalten kommen, wenn Methoden der nun falschen Klasse aufgerufen werden (direkte als auch indirekte magische Methoden wie __toString()). Insofern ist ein unsigniertes Übertragen von serialize-Daten über unsichere Wege nicht zu empfehlen.

Mit JSON passiert sowas deshalb nicht, weil damit immer stdclass-Objekte erzeugt werden. Das hat dann aber auch die Eigenschaft, dass man zu Fuss die Klassen instanttieren muss, die man eventuell eigentlich haben möchte.

dedlfix.