PHP baut ja in $_FILES
den Name der temporären Datei ein. Dieser wird beim Start des Skripts erzeugt und ist eindeutig. Die Funktionen move_uploaded_file()
und is_uploaded_file()
überprüfen, ob die als Argument angegebene Datei hochgeladen wurde, indem diese kurzerhand überprüfen, ob der Dateiname in $_FILES[*]['tmp_name']
enthalten ist. Wurde die Datei nicht in der Sitzung/Instanz hochgeladen, dann steht deren temporärer Name schlicht nicht drin.
Ein Angreifer könnte übrigens einen Dateiname, den ein anderer hochgeladen hat durchaus erraten, denn das schwer aber sicherlich nicht unmöglich. Aber dazu braucht er a) lokale Informationen wie die temporären Namen der vorher hochgeladenen Dateien und vor allem die Möglichkeit, eine beliebige Datei auf dem System öffnen oder womöglich gar verändern zu können.
Dabei kommen so viele Probleme zusammen (die veränderte Datei wird z.B. wieder gelöscht wenn das Skript des eigentlichen Hochladers beendet wird), dass ein Angriff darauf unbekannt ist.
Die Voraussetzungen zum Lesen der Datei sind schon so hoch, dass man „ein ganz anderes Problem“ hat, wenn es auf dem System ein Skript gäbe, mit dem man beliebige Dateien lesen kann:
Ein Skript mit etwas Dummen wie …
<?=readfile( $_GET['FileName'] ); ?>
… wird ja wohl hoffentlich keiner online stellen - oder?