Frage

ich an einem Skript arbeite, die Börse zu dem Server verarbeitet und als zusätzliche Sicherheitsebene würde Ich mag wissen:

Gibt es eine Möglichkeit, eine Datei wahren Erweiterung / Dateityp zu erkennen und sicherzustellen, dass es nicht einen anderen Dateityp mit einer anderen Erweiterung maskiert ist?

Gibt es ein Byte Stempel oder eine eindeutige Kennung für jeden Typ / Erweiterung?

Ich möchte in der Lage sein zu erkennen, dass jemand eine andere Erweiterung auf die Datei nicht angelegt hat sie hochladen.

Danke,

War es hilfreich?

Lösung

Nicht wirklich, nein.

Sie müssen die ersten paar Bytes jeder Datei lesen und es als ein Header für eine endliche Menge von bekannten Dateitypen zu interpretieren. Die meisten Dateien haben unterschiedliche Datei-Header, eine Art von Metadaten in den ersten paar Bytes oder die ersten paar Kilobyte im Fall von MP3.

Ihr Programm wird einfach versuchen, die Datei für jede Ihrer akzeptierten Dateitypen Parsen.

Für mein Programm, ich sende das hochgeladene Bild imagemagick in einem Try-Catch-Block, und wenn es bläst, dann denke ich, es ist ein schlechtes Bild war. Dies sollte unsicher betrachtet werden, weil ich willkürlich bin Laden (im Lieferumfang enthalten) binäre Daten in ein externes Programm, das im Allgemeinen ein Angriffsvektor ist. hier, ich bin ImageMagick zu vertrauen, etwas zu meinem System nicht zu tun.

ich empfehlen, einen eigenen Handler für die bedeutenden Dateitypen Schreiben Sie beabsichtigen, zu verwenden, um alle Angriffsvektoren zu vermeiden.

Bearbeiten. Ich sehe in PHP gibt es einige Werkzeuge, um dies zu tun für Sie

Auch MIME-Typen sind, was der Browser des Benutzers die Datei vorgibt zu sein. Es ist handlich und nützlich für diejenigen, und wirken auf sie in Ihrem Code zu lesen, aber es ist keine sichere Methode, weil jemand Ihnen schlechte Dateien fälschen die MIME-Header leicht zu senden. Es ist eine Art Verteidigungs Front Code zu halten, die von barfing auf einem PNG eine JPEG erwartet, aber wenn jemand einen Virus in einem EXE eingebettet und es JPEG genannt, gibt es keinen Grund, nicht den MIME-Typen gefälscht zu haben.

Andere Tipps

PHP hat ein paar Möglichkeiten des Lesens Dateiinhalte seinen MIME-Typ zu bestimmen, auf dem je PHP-Version Sie verwenden:

Haben Sie einen Blick auf die Fileinfo-Funktionen , wenn Sie mit PHP 5.3 +

$finfo = finfo_open(FILEINFO_MIME); 
$type = finfo_file($finfo, $filepath);
finfo_close($finfo);  

Alternativ Besuche mime_content_type für ältere Versionen.

$type = mime_content_type($filepath);

Beachten Sie, dass nur den Dateityp Validierung ist nicht genug, wenn Sie wirklich sicher sein wollen. Jemand könnte zum Beispiel lädt eine gültige JPEG-Datei, die eine Sicherheitslücke in einem gemeinsamen Renderer ausnutzt. Um dies zu verhindern, müssen Sie einen gepflegten Virenscanner.

PHP hat eine superglobalen $ _ FILES , die Informationen wie Größe und Dateityp hält. Es sieht aus wie die Art Form, eine Art eines Kopf genommen wird, nicht um eine Erweiterung, aber ich kann falsch sein.

Es ist ein Beispiel dafür auf w3schools Website .

Ich werde prüfen, ob es kann, ist dazu verleitet werden, wenn ich eine Chance bekommen.

UPDATE:

Alle anderen wusste dies wahrscheinlich, kann aber $ _FILES ausgetrickst werden. Ich konnte es auf diese Weise bestimmen:

$arg = escapeshellarg( $_FILES["file"]["tmp_name"] );
system( "file $arg", $type );
echo "Real type:  " . $type;

Es nutzt im Grunde Unix Befehl Datei. Es gibt wahrscheinlich bessere Möglichkeiten, aber ich habe nicht PHP in einer Weile benutzt. Ich vermeide in der Regel Systembefehle wenn möglich verwenden.

das noch gefälscht werden könnte. Ich würde sicherstellen, dass Sie nicht (oder nicht) eine Datei auf den Server automatisch hochgeladen ausgeführt werden.

Ich hätte auch einen Viren / Spyware-Scanner , und lassen Sie es die Arbeit für Sie tun.

Sie können Code unten verwenden, die Sie Typ gibt MIME, wenn Sie die Erweiterung geändert haben dann auch

$finfo = finfo_open(FILEINFO_MIME_TYPE);
echo $mime = finfo_file($finfo, $_FILES['userfile']['tmp_name']);
finfo_close($finfo);

Windows-Benutzer: nur php.ini bearbeiten und kommentieren Sie die folgende Zeile:

extension=php_fileinfo.dll

Denken Sie daran, Apache neu starten, damit neue php.ini zu übernehmen.

* nichts, die ersten beiden Bytes der Datei, die Sie erzählt (siehe „magische Zahl“). In Windows, ... manchmal wird dies wahr ( "header info") sein. Es ist letztlich O. S. abhängig ist.

Executables hat im allgemeinen eine „Signatur“ auf dem ersten Bytes; Ich finde es allerdings schwer, wirklich festzustellen, was der Dateityp wirklich ist.

Welche Dateitypen erwarten Sie? Vielleicht könnten Sie prüfen, ob es passt sich an, was Sie erwarten und lehnen alles andere.

Andere haben bereits erwähnt Fileinfo, die ich denke, die richtige Lösung ist, aber ich werde dies für den Fall hinzufügen, können Sie nicht, dass man aus irgendeinem Grunde verwenden. Die meisten (alle?) * Nix-Distributionen enthalten einen Befehl namens file, dass, wenn auf eine Datei ausgeben wird seine Art ausgeführt werden. Es hat einen Schalter zur Ausgabe in lesbarer Form (Standard) oder dem MIME-Typ. Sie könnte Ihr Skript dieses Programm auf der hochgeladenen Datei aufrufen und das Ergebnis ablesen. Auch dies ist nicht der bevorzugte Ansatz. Wenn Sie unter Windows sind, dann ist dieses Dienstprogramm durch Cygwin zur Verfügung.

prüft den MIME-Typ einfach genug? Ich gehe davon aus, dass auf eine Datei die Erweiterung ändert sich nicht ändert es MIME-Typ ist?

Ist MIME stark genug Indikator geben, indem Sie hier gehen?

Danke für alle Antworten so weit.

  

prüft den MIME-Typ einfach genug? Ich gehe davon aus, dass auf eine Datei die Erweiterung ändert sich nicht ändert es MIME-Typ ist? Ist MIME stark genug Indikator geben, indem Sie hier gehen?

Es hängt wirklich davon ab, wie es verwendet wird.

  • Wenn Sie Up- und Downloads zur Verfügung stellen, dann nichts zählt, da es nicht ausgeführt.
  • Wenn es vom Webserver behandelt ist, dann abhängig sein, es wird, wie der Web-Server konfiguriert ist, obwohl unter den meisten anderen dieser Kommentare.
  • Wenn es ein Bild ist, wird es entweder Display, oder nicht, oder das Ziel der Bildbibliothek Exploits sein. Aber nur die.
  • So etwas wie eine PDF-Datei nicht den Server beeinflussen kann, sondern der Computer der Person Zugriff auf die Datei.
  • Wenn es wird eine Funktion übergeben werden, wie „System ()“ dann sind wir auf das O Verhalten zurück -., Als ob es „doppelgeklickt“ waren, und die Dateierweiterung auch in Betracht gezogen werden könnte
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top