Wie mache ich ein sicheres Skript zum Hochladen von Dateien in PHP?

8

Ich überprüfe die Datei auf ihre Erweiterung und den MIME-Typ. Gibt es noch etwas, das ich tun kann, um Datei-Uploads sicherer zu machen?

ist für einen Avatar (also sind alle Bilder in einem Ordner). Ich habe darüber nachgedacht, htaccess zu benutzen, um jegliche php-Ausführung zu verbieten, nur wenn eine php-Datei ihren Weg dorthin gefunden hat. Was denkst du?

    
phpuploader 29.11.2009, 16:07
quelle

2 Antworten

19

Weder die Dateierweiterung noch der MIME-Typ können Ihnen zu 100% Sicherheit geben, dass Sie mit einer Bilddatei arbeiten. Aber solange Sie die Datei nicht ausführen (z. B. mit include ()), ist das kein Problem und Sie müssen nicht nach PHP-Code oder irgendetwas anderem suchen. Die einzige Sicherheitslücke, die mit einer gefälschten Bilddatei denkbar wäre, wäre etwas, das die Browser-Rendering-Engine ausnutzt. Dies ist unmöglich gegen die Server-Seite zu schützen und liegt in der Verantwortung des Browser-Anbieters.

Also, solange Sie sicherstellen, dass Sie is_uploaded_file() und < a href="http://php.net/manual/en/function.move-uploaded-file.php"> move_uploaded_file() Wenn Sie mit dem Upload arbeiten, sollten Sie mindestens das Bildformat verwenden Vorderseite. Stellen Sie sicher, dass Sie den @ bobince-Post unten lesen und folgen Sie dem Link, er enthält eine Reihe von großartigen Informationen zu anderen Sicherheitsaspekten im Umgang mit Dateien.

Sie können jedoch, um maximale Sicherheit zu gewährleisten, das Bild natürlich in einen neuen Bildcontainer kopieren, indem Sie GD imagecopy verwenden. Dies würde jegliche ID3- und andere Header-Informationen löschen, die in der Datei enthalten sind, und wahrscheinlich alle Exploit-Versuche zerstören (GD würde wahrscheinlich eine solche Datei ersticken und einen Fehler zurückgeben). Dies funktioniert natürlich nur für GIF, JPEG und PNG, und es können Probleme wie Alphakanal und Farbprofilprobleme auftreten.

    
Pekka 웃 29.11.2009 16:12
quelle
16
  1. Verwenden Sie niemals von Benutzern eingereichte Dateinamen. Schaffe neue wie "Zufallszahl" .jpeg. "Sanitizing" -Dateinamen sind schwieriger als Sie denken, insbesondere wenn die App auf einem Windows-Server ausgeführt werden kann.

  2. Verwenden Sie für Bilder die Funktion PHP getimagesize , um den Dateityp eines Bildes zu ermitteln, anstatt die hochgradig unzuverlässigen Dateinamen- und MIME-Typ-Übermittlungen zu betrachten. Hochladen von Videos, die nicht als Bilder analysiert werden, nicht zulassen.

  3. Bei Dateien, die heruntergeladen werden sollen, verwenden Sie den Header Content-Disposition: attachment , um das IE-Sniffing für HTML-Inhalte zu stoppen und im Browser anzuzeigen.

  4. Bei Dateien, die inline angezeigt werden müssen, müssen Sie sie von einem anderen Hostnamen an Ihre Hauptwebsite senden, da andernfalls der darin enthaltene HTML-Inhalt in Ihren Sicherheitskontext cross-site-scripten kann.

Die Funktion zum Hochladen von Dateien ist schwer . Weitere Diskussionen .

    
bobince 29.11.2009 17:07
quelle

Tags und Links