PHP - Gefilterte unserialize()
Einführung
Hallo da! Willkommen auf unserer Reise in die Welt der PHP-Programmierung. Heute tauchen wir tief ein in ein Thema, das für Anfänger sowohl aufregend als auch ein wenig einschüchternd sein kann: unserialize()
mit Filtern. Aber keine Sorge, ich werde dich schrittweise durch führen und sicherstellen, dass du alles verstehst.
Was ist Serialisierung?
Bevor wir zu unserialize()
springen, lassen's uns zuerst verstehen, was Serialisierung ist. Serialisierung ist der Prozess der Konvertierung eines Objekts oder einer Datenstruktur in ein Format, das gespeichert oder übertragen und später rekonstruiert werden kann. In PHP wird dies oft mit der Funktion serialize()
durchgeführt.
$data = array('a', 'b', 'c');
$serialized_data = serialize($data);
echo $serialized_data; // Ausgabe: a:3:{i:0;s:1:"a";i:1;s:1:"b";i:2;s:1:"c";}
In dem obigen Beispiel haben wir ein Array $data
, das mit serialize()
in eine Zeichenkette serialisiert wird. Die resulting Zeichenkette kann dann in einer Datenbank gespeichert oder über das Netzwerk gesendet werden.
Was ist Deserialisierung?
Deserialisierung ist der umgekehrte Prozess der Serialisierung. Sie nimmt eine serialisierte Zeichenkette und konvertiert sie zurück in ihre ursprüngliche Form. In PHP wird dies mit der Funktion unserialize()
durchgeführt.
$serialized_data = 'a:3:{i:0;s:1:"a";i:1;s:1:"b";i:2;s:1:"c";}';
$data = unserialize($serialized_data);
print_r($data); // Ausgabe: Array ( [0] => a [1] => b [2] => c )
In diesem Beispiel nehmen wir die serialisierte Zeichenkette $serialized_data
und konvertieren sie zurück in ein Array mit unserialize()
.
Was sind Filter?
Nun, lassen's uns über Filter sprechen. Wenn du mit deserialisierten Daten arbeitest, ist es wichtig, sicherzustellen, dass die Daten sicher und gültig sind. Hier kommen Filter ins Spiel. Filter erlauben dir, zusätzliche Regeln festzulegen, wie die Daten während der Deserialisierung behandelt werden sollen.
Es gibt zwei Haupttypen von Filtern in PHP:
-
Optionen: Diese werden verwendet, um das Verhalten von
unserialize()
zu steuern. Zum Beispiel kannst du die OptionUNSERIALIZE_THROW_ON_INVALID
verwenden, um eine Ausnahme zu werfen, wenn die Daten nicht deserialisiert werden können. - Callbacks: Diese sind benutzerdefinierte Funktionen, die verwendet werden können, um eine benutzerdefinierte Validierung oder Transformation der deserialisierten Daten durchzuführen.
Verwendung von Filtern mit unserialize()
Nun, da wir die Grundlagen abgedeckt haben, sehen wir uns an, wie wir Filter mit unserialize()
verwenden können. Wir beginnen mit dem Options-Filter.
Options Filter
Die Option UNSERIALIZE_OPTIONS
ermöglicht es dir, zusätzliche Flags festzulegen, die das Verhalten von unserialize()
steuern. Hier ist ein Beispiel:
$serialized_data = 'a:3:{i:0;s:1:"a";i:1;s:1:"b";i:2;s:1:"c";}';
$options = ['options' => ['allowed_classes' => false]];
$data = unserialize($serialized_data, $options);
In diesem Beispiel haben wir die Option allowed_classes
auf false
gesetzt, was bedeutet, dass nur PHPs native Klassen deserialisiert werden dürfen. Wenn die serialisierten Daten eine andere Klasse enthalten, wird ein Fehler geworfen.
Callback Filter
Der Callback-Filter ist eine fortgeschrittene Funktion, die es dir ermöglicht, deine eigene Validierungs- oder Transformationslogik zu definieren. Hier ist ein Beispiel:
function my_callback($class, $data, $filter) {
if ($class === 'MyClass') {
return new MyClass($data);
}
return false;
}
$serialized_data = 'O:8:"MyClass":1:{s:4:"name";s:5:"Alice";}';
$data = unserialize($serialized_data, ['callback' => 'my_callback']);
In diesem Beispiel haben wir eine Callback-Funktion my_callback()
definiert, die überprüft, ob die zu deserialisierende Klasse MyClass
ist. Wenn ja, erstellt sie eine neue Instanz von MyClass
mit den bereitgestellten Daten. Wenn nicht, gibt sie false
zurück, was dazu führt, dass unserialize()
fehlschlägt.
Schlussfolgerung
Puh! Das war doch einiges, oder? Ich hoffe, du hast nun ein besseres Verständnis von Serialisierung, Deserialisierung und der Verwendung von Filtern mit unserialize()
in PHP. Denke daran, Übung macht den Meister, also probiere diese Konzepte mit einigen Beispiel-Daten aus. Und vergiss nicht, Spaß dabei zu haben!
Credits: Image by storyset