2009-03-18 15 views
0

Ich versuche, auf unserer neuen Website ein Modul zum Hochladen von Dateien zu entwickeln, mit dem Sie beliebige Dateien auf unsere Server hochladen können. Die hochgeladene Datei wird in /files hochgeladen, in dem die folgenden .htaccess zu verhindern, dass Benutzer die Ausführung dh eine Php-Datei:Sicheres Hochladen von PHP-Dateien

<Files *.*> 
ForceType applicaton/octet-stream 
</Files> 

Dies löst die Browser-Fenster downloaden (zumindest in FF und Safari), aber ist es sicher anzunehmen, dass die Datei nicht auf dem Server mit dieser Methode ausgeführt wird? Wenn nicht, wie würden Sie eine solche Lösung implementieren?

Antwort

2

ist es sicher anzunehmen, dass die Datei nicht auf dem Server mit dieser Methode ausgeführt wird?

Art von, aber es hängt davon ab, welche anderen Direktiven in Ihrer Konfiguration vorhanden sind; Vielleicht gibt es andere Regeln, die PHP-Dateien ausführen können. Wenn PHP nur durch die Eingabe des PHP-Handlers für den Dateityp aktiviert wird, sollte dies die Ausführung von PHP stoppen.

Das Beenden von PHP ist jedoch nur eine Ihrer Sorgen. Wenn Benutzer Dateien hochladen, die aktiven Inhalt enthalten, z. B. HTML oder Flash - selbst wenn der Dateityp angibt, dass es sich um ein unschuldiges Bild handelt, können sie die Kontrolle über die Sitzungen anderer Benutzer auf Ihrer Website durch Cross-Site Scripting (XSS) erlangen. Eine Erörterung hierzu finden Sie unter Stop people uploading malicious PHP files via forms.

Eine 'download.php'-Schnittstelle, die Content-Disposition verwendet, um immer die Download-Box auszulösen, gekoppelt mit dem Speichern der Dateien unter nicht-user-dateinamen wie' 1234.dat ', ist viel sicherer.

+0

Während Content-Disposition: attachment den Download auf allen gebräuchlichen Browsern, Opera, Safari, anstößt, wird Konquerer es weiterhin im Kontext der Website öffnen, so dass die Datei Zugriff auf den Session-Cookie hat. –

3

Ich denke, das sicherste, was 100% Web-Zugriff auf das Verzeichnis zu beschränken ist, und hat ein Skript wie download.php, durch denen Sie eine Datei-ID übergeben, die dann die sachgemäße Datei und gibt sich an den Browser abruft. Ich bin mir jedoch ziemlich sicher, dass das, was Sie haben, funktioniert und sicher ist.

1

Ich glaube, Sie eigentlich diese wollen:

<Directory /path/to/files> 
    SetHandler default-handler 
</Directory> 

Was haben Sie vielleicht in der Praxis funktionieren, da der Server standardmäßig so konfiguriert ist, nicht etwas auszuführen, wenn nicht ausdrücklich so zu tun, erzählt, aber es ist nicht wirklich garantieren, dass nichts ausgeführt wird. ForceType legt nur den Inhaltstyp für statische Dateien fest (ich bin mir nicht sicher, aber ich bezweifle, dass es ausführbare Skripte betrifft).

0

Ich stimme Paolo zu, sein Weg ist sicherer. Es gibt immer das Problem, dass jemand Ihre PHP-Dateien ausnutzt, um eine hochgeladene Datei auszuführen. Schlechtes Beispiel:

include_once("/modules/".$_GET["module"].".php"); 

Wo jemand übergeben module=../Files/exploit

1

Entsendemitgliedstaaten Paolo Antwort, Ihre Dateien Verzeichnis aus dem zugänglichen Pfad bewegen. Sie können dann das Skript download.php mit PEARs HTTP_Download Modul schreiben, um die Dateien zu senden.

0

Für maximale Sicherheit müssen Sie den Ordner mit den hochgeladenen Dateien von einer separaten Partition mit dem No-Exec-Flag bereitstellen.

Verwandte Themen