In der PHP -Entwicklung wird die Serialize () -Funktion häufig verwendet, um Datenstrukturen (wie Arrays oder Objekte) in Zeichenfolgen für einfache Speicherung oder Übertragung umzuwandeln. In Zusammenarbeit mit Datei -Uploads kann eine unzureichende Versorgung jedoch zu Sicherheitslücken führen, insbesondere bei der Deserialisierung von Daten. In diesem Artikel werden in dem Datei -Upload -Szenario die Funktion Serialize () sicher verwendet und den Best Practices folgt.
Die Serialize () -Funktion von PHP wandelt PHP -Werte (z. B. Arrays, Objekte usw.) in Zeichenfolgenformate um, die gespeichert oder übertragen werden können. Zum Beispiel:
$data = ['username' => 'admin', 'password' => '12345'];
$serialized_data = serialize($data);
echo $serialized_data;
Die Ausgabe kann sein:
a:2:{s:8:"username";s:5:"admin";s:8:"password";s:5:"12345";}
Unserialize () wird relativ verwendet, um den String -Ausgang von Serialize () in PHP -Werte umzuwandeln. Während des Hochladens des Datei -Uploads speichern wir die Dateidaten in einer Datei eines bestimmten Formats, z. B. das Speichern der von Datei hochgeladenen Informationen über Serialize () .
Angenommen, wir haben eine Datei -Upload -Funktion, bei der Benutzer Dateien hochladen und relevante Informationen über Serialize () speichern können. Einfache Datei -Upload -Codes können wie folgt sein:
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['file'])) {
$file = $_FILES['file'];
$file_data = [
'filename' => $file['name'],
'filetype' => $file['type'],
'filesize' => $file['size'],
'filetmp' => $file['tmp_name']
];
// verwenden serialize() Dateiinformationen speichern
$serialized_data = serialize($file_data);
file_put_contents('uploads/file_info.txt', $serialized_data);
}
Die Deserialisierung (d. H. Unerialize () ) kann einige Risiken darstellen, insbesondere wenn ein Angreifer in der Lage ist, erniedrigte Daten zu manipulieren, die böswilligen Code ausführen oder die Datenintegrität beschädigen können. Beispielsweise kann ein Angreifer sorgfältig konstruierte serialisierte Daten mit böswilligen PHP -Objekten oder Code hochladen.
Um die Sicherheit der Deserialisierung zu gewährleisten, finden Sie hier einige Best Practices:
Serialisieren Sie nicht sensible Informationen (wie Passwörter, API -Schlüssel usw.) und speichern Sie sie über Serialize () . Diese Informationen sollten immer in verschlüsselter Form gespeichert werden.
Überprüfen Sie beim Hochladen von Dateien den Dateityp und die Dateigröße, um das Hochladen von böswilligen Dateien zu vermeiden. Sie können $ _files ['Datei'] ['Typ'] und $ _files ['Datei'] ['Größe'] verwenden, um den Dateityp und die Dateityp und Größe zu bestimmen:
if ($file['size'] > 5000000) {
echo "Zu große Datei";
exit;
}
$allowed_types = ['image/jpeg', 'image/png'];
if (!in_array($file['type'], $allowed_types)) {
echo "Nicht unterstützte Dateitypen";
exit;
}
Mit PHP können Sie Objekte erstellen, wenn Sie deserialisiert sind. Wenn die Verwendung der Klasse nicht eingeschränkt ist, kann der Angreifer ein böswilliges Objekt übergeben, was eine gefährliche Codeausführung auslöst. Sie können die Deserialisierung von böswilligen Klassen verhindern, indem Sie den Parameter AUDLAUSE_CLASSS einstellen:
$data = file_get_contents('uploads/file_info.txt');
$file_data = unserialize($data, ["allowed_classes" => false]); // Deaktivieren Sie die Erstellung von Objekten
Dieser Schritt kann Angreifer effektiv daran hindern, böswilligen Code mithilfe von Deserialisierungsanfälligkeiten auszuführen.
Um die Integrität der hochgeladenen Daten zu gewährleisten, können Sie die Hash -Werte (z. B. MD5, SHA256) verwenden, um die hochgeladenen Dateidaten zu überprüfen. Wenn eine Datei hochgeladen wird, wird ein Hash generiert und mit dem Hash der tatsächlichen Datei verglichen, wodurch Manipulationen vermieden werden.
$uploaded_hash = hash_file('sha256', $file['tmp_name']);
$stored_hash = file_get_contents('uploads/file_hash.txt');
if ($uploaded_hash !== $stored_hash) {
echo "Der Dateiinhalt wurde manipuliert";
exit;
}
Das Datei -Upload selbst kann auch zum Eingang zu Angriffen werden. Um böswillige Datei -Uploads zu verhindern, müssen neben der Überprüfung der Dateityp und der Größe Maßnahmen ergriffen werden, um zu verhindern, dass Benutzer ausführbare PHP -Dateien hochladen. Beispielsweise ist das Hochladen von Dateitypen wie .php und .exe verboten oder das Speichern von hochgeladenen Dateien in nicht ausgeführten Verzeichnissen.
$disallowed_extensions = ['php', 'exe'];
$file_extension = pathinfo($file['name'], PATHINFO_EXTENSION);
if (in_array(strtolower($file_extension), $disallowed_extensions)) {
echo "Dieser Dateityp ist verboten";
exit;
}
Speichern Sie Dateien und Daten an einem sicheren Ort und stellen Sie sicher, dass hochgeladene Dateien ordnungsgemäß isoliert und geschützt sind. Anstatt die Serialisierungsergebnisse der gesamten Dateidaten zu speichern, können Sie die Datenbank verwenden, um die Metadaten der hochgeladenen Datei (z. B. Dateipfade, Hashes usw.) zu speichern.
Bei der Kombination der Funktion "Serialize () mit der Datei -Upload -Funktion müssen Sie auf Sicherheitsprobleme achten. Faktoren wie Deserialisierungangriffe, Dateityp- und Größenüberprüfung, Dateispeichermethoden usw. Erfordern sich während des Entwicklungsprozesses strenger Design und Schutz. Durch die Verwendung von Best Practices können wir die Sicherheit von Datei -Uploads sicherstellen und so böswillige Benutzer daran hindern, Schwachstellen auszunutzen.
Das obige ist die beste Praxis, wie die Funktion Serialize () in PHP sicher verwendet und mit dem Datei -Upload kombiniert wird. Wenn Sie Fragen haben, können Sie gerne fragen!