Frage

Auf der PHP-Website, die einzige wirkliche Kontrolle sie vorschlagen wird mit is_uploaded_file() oder move_uploaded_file(), hier . Natürlich in der Regel Sie nicht möchten, dass Benutzer jede Art von Datei, für eine Vielzahl von Gründen, zu.

Aus diesem Grund habe ich oft eine „strenge“ Mime-Typ Prüfung verwendet. Natürlich ist dies sehr fehlerhaft, da oft Mime-Typen falsch sind und die Benutzer ihre Datei nicht laden kann. Es ist auch sehr leicht zu fälschen und / oder zu ändern. Und zusammen mit all das, jeder Browser und OS beschäftigt sich mit ihnen anders.

Eine andere Methode ist die Erweiterung zu überprüfen, was natürlich noch einfacher zu ändern, als MIME-Typ.

Wenn Sie nur Bilder wollen, so etwas wie getimagesize() mit arbeiten.

Was ist mit anderen Arten von Dateien? PDFs, Word-Dokumente oder Excel-Dateien? Oder auch nur Text-Dateien?

Edit: Wenn Sie nicht über mime_content_type oder Fileinfo und System ( "file -bi $ uploadedfile ") gibt Ihnen den falschen Dateityp, welche andere Möglichkeiten gibt es?

War es hilfreich?

Lösung

Hier finden Sie aktuelle mime_content_type oder Dateiinfo . Diese sind integrierte PHP-Befehle zur Bestimmung des Typs einer Datei, indem du den Inhalt der Datei suchen. Auch die Kommentare überprüfen auf den oben genannten zwei Seiten, es gibt einige andere gute Vorschläge.

persönlich viel Glück habe ich habe mit etwas, das im Wesentlichen system("file -bi $uploadedfile") ist, aber ich bin nicht sicher, ob das die beste Methode.

Andere Tipps

IMHO alle MIME-Typprüfung Methoden sind nutzlos.

Angenommen, Sie haben die MIME-Typ application/pdf haben sollte. Standardmethoden versuchen, etwas zu finden, das wie ein PDF-Header sieht (%PDF- oder smth. Ähnlich), und sie werden zurückkehren ‚Okay, scheint dies eine PDF-Datei‘ auf Erfolg. Aber in der Tat ist dies nicht bedeutet nichts. Sie können eine Datei laden nur %PDF-1.4 enthält, und es wird MIME-Check passieren.

Ich meine, wenn die Datei einen erwarteten MIME-Typen hat -. Es wird den MIME-Typ-Check immer passiert ansonsten ist das Ergebnis undefiniert

Ich nehme an, Sie werden eine feste Weiß-Liste von Dateitypen haben, die Sie akzeptieren.

Für jede dieser Arten, werden Sie verschiedene Techniken haben, zu verwenden, um sicherzustellen, dass sie gültige Beispiele für dieses Format sind.

Es gibt zwei relevante Fragen:

  • Sieht es etwa wie es der richtige Typ sein könnte? (Bei JPEG können Sie die Header überprüfen, wie Sie bereits erwähnt. Für viele Unix-basierte Formate, können Sie den "Magic Cookie" überprüfen.)

  • Ist es eigentlich ein gutes Beispiel für diesen Typ (zum Beispiel für jede XML-Format wie Sie gegen eine DTD validieren können.)

Ich denke, dass für jedes Format, sollten Sie separate Fragen für jeden fragen, weil die Antwort ganz anders sein wird für PDF-Dateien im Vergleich zu ZIP-Dateien.

Ich habe mime_content_type, die mit PHP 5.2 kompatibel ist, weil ich weder Fileinfo kann noch system() (es PHP 5.3 erfordert), ist die von meinem Provider deaktiviert. Zum Beispiel, überprüfe ich, ob eine Datei eine Textdatei ist so:

if (strcmp(substr(mime_content_type($f),0,4),"text")==0) { ... }

Sie können ein vollständiges Beispiel in meinem „PHP-Verzeichnis und Unterverzeichnis Listener & File Viewer und Downloader“ sehen: http://www.galgani.it/software_repository/index.php

if(isset($_FILES['uploaded'])) {
    $temp = explode(".", $_FILES["uploaded"]["name"]);

    $allowedExts = array("txt","htm","html","php","css","js","json","xml","swf","flv","pdf","psd","ai","eps","eps","ps","doc","rtf","ppt","odt","ods");

    $extension = end($temp);
    if( in_array($extension, $allowedExts)) {
       //code....

    } else {
        echo "Error,not Documentum type...";
    }
}

Hier ist die Funktion file_mime_type von iZend:

function file_mime_type($file, $encoding=true) {
    $mime=false;

    if (function_exists('finfo_file')) {
        $finfo = finfo_open(FILEINFO_MIME);
        $mime = finfo_file($finfo, $file);
        finfo_close($finfo);
    }
    else if (substr(PHP_OS, 0, 3) == 'WIN') {
        $mime = mime_content_type($file);
    }
    else {
        $file = escapeshellarg($file);
        $cmd = "file -iL $file";

        exec($cmd, $output, $r);

        if ($r == 0) {
            $mime = substr($output[0], strpos($output[0], ': ')+2);
        }
    }

    if (!$mime) {
        return false;
    }

    if ($encoding) {
        return $mime;
    }

    return substr($mime, 0, strpos($mime, '; '));
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top