Aktueller Standort: Startseite> Neueste Artikel> Welche Probleme werden auftreten, wenn Bild_Type_to_extension () das Dateiformat bei Verwendung nicht überprüft? Was sind die Risiken?

Welche Probleme werden auftreten, wenn Bild_Type_to_extension () das Dateiformat bei Verwendung nicht überprüft? Was sind die Risiken?

M66 2025-06-23

Risiko, Dateiformate nicht zu überprüfen

1. Forged -Dateitypen Bypass Upload -Überprüfung

Ein Angreifer kann ein böswilliges Skript (z. B. PHP -Code) hochladen, indem er sich als Bild tarnt. Nennen Sie beispielsweise ein Skript mit einer PHP -Backdoor .jpg oder .png und laden Sie es hoch. Wenn Sie exif_imagetype () nicht verwenden, um den tatsächlichen Dateityp zu erkennen, kann Image_type_to_extesion () die rechtliche Erweiterung fälschlicherweise zurückgeben, die nachfolgende Logik irreführen und sogar im ausführbaren Verzeichnis speichern:

 $filename = $_FILES['image']['tmp_name'];
$ext = image_type_to_extension(@exif_imagetype($filename));
// Falsche Verwendung:Keine Erkennungexif_imagetypeIst der Rückgabewert derfalse
$newName = uniqid() . $ext;
move_uploaded_file($filename, "/var/www/html/uploads/" . $newName);

Wenn die hochgeladene Datei kein echtes Bild ist, z. B. ein gefälschtes PHP -Skript, aber die Erweiterung ist .JPG , kann ein Angreifer einen böswilligen Code ausführen, indem er http://m66.net/uploads/xxxx.jpg besucht.

2. exif_imagetype () fällt fehl und gibt falsch zurück, gibt aber immer noch in Image_type_to_extension () übergibt

Wenn exif_imagetype () den Dateityp nicht erkennt, gibt er false zurück. Wenn das Ergebnis zu diesem Zeitpunkt immer noch in Image_type_to_extension () übergeben wird, wird .Int (0) zurückgegeben, was zu Verwirrung im generierten Dateinamen und sogar logischen Ausnahmen führt. Zum Beispiel:

 $type = exif_imagetype($filename);
$ext = image_type_to_extension($type);
// Wenn$typefürfalse,$extfür"."

Dies kann dazu führen, dass das Programm die falsche Dateierweiterung verwendet, nachfolgende Vorgänge beeinflusst und sogar Ressourcenleckage verursacht.

3.. DateiInfo oder EXIF ​​-Erweiterung ist nicht aktiviert

In einigen Serverumgebungen schlägt exif_imagetype () fehl, wenn PHP keine DateiInfo- oder EXIF ​​-Erweiterungen aktiviert. Wenn Sie sich immer noch auf seine Ergebnisse verlassen und image_type_to_extension () übergeben, ist das Programm anfällig für Absturz oder Umgang logischer Fehler, was die Benutzererfahrung beeinflusst.

4. Die Sicherheitsrichtlinie, die von Erweiterungen abhängt, ist ungültig

Einige Sicherheitsrichtlinien für Dienstbereitstellungen sind basierend auf Erweiterungen eingeschränkt, wie nur .JPG- und .png -Dateien dürfen zugegriffen werden. Wenn ein Angreifer den Dateinamen gefälscht und die Backend -Prüfung umgangen hat, kann der Server den Zugriff fälschlicherweise gewähren.

Beispielsweise wird eine Datei namens .php.jpg hochgeladen, das reale Format ist jedoch PHP. Nginx wird unter bestimmten Konfigurationen als .php -Datei ausgeführt, was zu schwerwiegenden Folgen führt:

 <?php echo shell_exec($_GET['cmd']); ?>

Dann zugreifen Sie durch:

 http://m66.net/uploads/backdoor.php.jpg?cmd=ls

Sie können den Server aus der Ferne steuern.


Die richtige Art, es zu verwenden

Um die oben genannten Risiken zu vermeiden, sollten folgende Maßnahmen ergriffen werden:

  1. Verwenden Sie exif_imagetype () und bestimmen Sie, ob der Rückgabewert falsch ist

  2. Verwenden Sie Finfo_File () , um die MIME -Typen weiter zu überprüfen

  3. Eingeschränktes Upload -Verzeichnis nicht ausführbar

  4. Vertrauen Sie nicht dem Benutzer ausgemeldeten Erweiterungen

  5. Überprüfen Sie den Rückgabewert von Image_type_to_extension () mit der Whitelist

Beispielcode:

 $filename = $_FILES['image']['tmp_name'];
$imageType = @exif_imagetype($filename);

if ($imageType === false) {
    die('Nicht unterstützte Bildformate');
}

$ext = image_type_to_extension($imageType, false);
$allowed = ['jpg', 'jpeg', 'png', 'gif'];

if (!in_array($ext, $allowed)) {
    die('Nicht erlaubte Bildtypen');
}

$newName = uniqid() . '.' . $ext;
move_uploaded_file($filename, '/var/www/uploads/' . $newName);