21 Stimmen

Was ist der Zweck von is_uploaded_file()?

Sagen die Ärzte:

Gibt TRUE zurück, wenn die Datei mit dem Namen filename per HTTP POST hochgeladen wurde.

Wie könnte $_FILES['blah']['tmp_name'] möglicherweise nicht das Ergebnis eines POST-Uploads sein? PHP hat diesen Dateinamen erstellt.

Dies ist nützlich, um sicherzustellen, dass ein böswilliger Benutzer nicht das Skript dazu zu bringen, an Dateien zu arbeiten, an denen es nicht arbeiten sollte arbeiten sollte - zum Beispiel /etc/passwd.

Mir ist klar, dass ich den Inhalt und die Größe der Datei sorgfältig prüfen sollte. Aber wie könnte ein Angreifer die Kontrolle über die temporärer Dateiname der hochgeladenen Datei?

Oder hat is_uploaded_file() andere Kontrollen durchführen?

Danke, dass Sie etwas Licht ins Dunkel gebracht haben.

31voto

Jon Punkte 411383

In seiner jetzigen Form, is_uploaded_file prüft, ob das Hochladen von Dateien aktiviert ist (andernfalls kann es sich unmöglich um eine hochgeladene Datei handeln) und ob der angegebene Dateiname tatsächlich von PHP generiert wurde (ich weiß das, weil ich mir den Quelltext angesehen habe).

Dies ist nicht wirklich hilfreich, denn wenn es beim Hochladen keine Probleme gab, dann

is_uploaded_file($_FILES['blah']['tmp_name'])

würde immer zurückkehren true .

Bedenken Sie jedoch, dass $_FILES ist "erst" seit PHP 4.1.0 verfügbar, während is_uploaded_file erschien erstmals mit PHP 4.0.3. Die Schlussfolgerung, die hier logisch erscheint, ist, dass _war es ziemlich schwierig, die Handhabung hochgeladener Dateien sicher zu gestalten, bevor die $_FILES superglobal wurde zur Verfügung gestellt_ . Wenn nichts anderes, können Nicht-Superglobale injiziert werden, und zwar sehr leicht mit register_globals aktiviert, was ein weiterer wunder Punkt in Bezug auf die Sicherheit von PHP war.

Wenn man heute Code schreibt und die $_FILES wie man es sollte, dann würde ich sagen is_uploaded_file in seiner derzeitigen Implementierung "nutzlos" ist, weil es keinen Angriffsvektor gibt, der Sie dazu bringen kann, eine "schlechte" Datei zu verarbeiten.

Es gibt aber auch eine andere Sicht der Dinge: is_uploaded_file ist garantiert, dass es jetzt und in Zukunft korrekt funktioniert, solange es verfügbar ist, unabhängig davon, wie das Hochladen von Dateien und ihre Bereitstellung für den Programmierer funktioniert. Vielleicht im Augenblick es bietet nichts Konkretes, aber es ist eine Abstraktion über das Konzept des "sicheren Datei-Uploads", das mit einer Garantie verbunden ist. Ich würde denken, dass es keine solche Garantie gibt für $_FILES (auch wenn ich es für einen Rückschritt halten würde, wenn sich der derzeitige Status quo "zum Schlechteren" verändert).

13voto

Lightness Races in Orbit Punkte 367630

Nun, Sie können die cualquier Zeichenkette bis is_uploaded_file .

Sicher, wenn Sie ihm etwas direkt aus dem $_FILES dann wird sie natürlich immer zurückkehren true Aber wenn Sie das Argument selbst formulieren, dann vielleicht nicht.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X