In der Webentwicklung sind das Datei -Upload und Download gemeinsame Funktionsmodule. Wenn der Benutzereingang und die Ausgabe nicht streng gesteuert sind, ist es einfach, der Einstiegspunkt für Angriffe zu werden. Dieser Artikel konzentriert sich auf die PHP -Sprache und führt vor, wie Benutzereingaben- und Ausgabefunktionen verwendet werden, um die Sicherheit während des Hochladens und Herunterladens von Dateien effektiv zu steuern.
Vor der Verarbeitung einer Upload -Anforderung besteht der erste Schritt darin, den Typ der Datei zu überprüfen. Dies kann normalerweise mit einer Zwei-Faktor-Überprüfung von Dateierweiterungen und MIME-Typen erfolgen:
$allowedExtensions = ['jpg', 'png', 'gif'];
$allowedMimeTypes = ['image/jpeg', 'image/png', 'image/gif'];
$uploadedFileExtension = strtolower(pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION));
$uploadedFileType = $_FILES['file']['type'];
if (!in_array($uploadedFileExtension, $allowedExtensions) ||
!in_array($uploadedFileType, $allowedMimeTypes)) {
// Illegaler Dateityp,Verarbeitungslogik durchführen
}
Um eine böswillige Skriptausführung und Pfadüberschreib -Angriffe zu verhindern, wird empfohlen, Dateien automatisch von Benutzern hochgeladen zu werden:
$uploadedFileName = $_FILES['file']['name'];
$uploadedFileExtension = strtolower(pathinfo($uploadedFileName, PATHINFO_EXTENSION));
$newFileName = uniqid() . '.' . $uploadedFileExtension;
$newFilePath = '/path/to/upload/directory/' . $newFileName;
if (move_uploaded_file($_FILES['file']['tmp_name'], $newFilePath)) {
// Datei hochladen erfolgreich
}
Zusätzlich zur Erweiterung und zur MIME -Überprüfung wird empfohlen, den tatsächlichen Inhalt der Datei weiter zu analysieren. Sie können beispielsweise GetImageSize () oder eine Bibliothek von Drittanbietern verwenden, um festzustellen, ob die hochgeladene Datei ein echtes Bild ist:
$fileData = file_get_contents($_FILES['file']['tmp_name']);
if (!is_image($fileData)) {
// Dateien sind keine echten Bilder,Verarbeitungslogik durchführen
}
function is_image($fileData){
$allowedMimeTypes = ['image/jpeg', 'image/png', 'image/gif'];
if (function_exists('mime_content_type')) {
$fileMimeType = mime_content_type($fileData);
return in_array($fileMimeType, $allowedMimeTypes);
} else {
$finfo = new finfo(FILEINFO_MIME_TYPE);
$fileMimeType = $finfo->buffer($fileData);
return in_array($fileMimeType, $allowedMimeTypes);
}
}
Vor der Ausführung der Datei -Download -Logik müssen bestätigt werden, dass die vom Benutzer angeforderte Datei vorhanden ist und Zugriffsrechte aufweist:
$requestedFilePath = $_GET['file'];
if (!is_file($requestedFilePath) || !is_readable($requestedFilePath)) {
// Die Datei existiert nicht oder ist nicht lesbar
}
Um zu verhindern, dass der Browser versehentlich Download -Inhalte ausführt, sollte die für den Datei heruntergeladenen HTTP -Headerinformationen festgelegt werden:
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=" . basename($requestedFilePath));
header("Content-Transfer-Encoding: binary");
header("Content-Length: " . filesize($requestedFilePath));
readfile($requestedFilePath);
Beim Implementieren von Datei -Hochladen und Download in PHP ist es alles andere als ausreichend, ausschließlich auf grundlegende Funktionen zu stützen. Ein zuverlässigeres und sichereres Dateiverwaltungssystem muss mit mehreren Mitteln erstellt werden, z. B. Überprüfung des Dateityps, die Umbenennung von Verarbeitungen, sicheren Scannen und Download -Berechtigungssteuerung. Darüber hinaus wird empfohlen, die Größe der Upload -Datei zu begrenzen, die Berechtigungen des Upload -Verzeichnisses zu steuern und Missbrauch und andere detaillierte Strategien herunterzuladen.