Forum und email

is_uploaded_file

(PHP 4 >= 4.0.3, PHP 5)

is_uploaded_file — Zegt of een bestandsnaam geupload is via HTTP POST

Beschrijving

bool is_uploaded_file ( string $filename )

Geeft TRUE terug als het bestand aangegeven bij filename geupload is via HTTP POST. Dit is handig om te controleren of een kwaadwillige gebruiker niet probeert het script voor de gek te houden door hem te laten werken met bestanden waarmee hij niet behoort te werken, bijvoorbeeld /etc/passwd

Deze controle is zeker van belang als er enige kans is dat iets met het geuploade bestand gedaan wordt dat de inhoud van het bestand prijs kan geven aan de gebruiker, of zelfs aan enige andere gebruiker op het systeem.

is_uploaded_file() is alleen beschikbaar vanaf PHP 3.0.16 en PHP 4.0.2. Als je vast zit aan vroegere versies, dan kan je de volgende functies gebruiken om jezelf te beschermen:

Note: Het volgende voorbeeld werkt niet in PHP 4.0.2 of HOGER. Het is afhankelijk van interne functionaliteiten van PHP die na deze versie veranderd zijn.

<?php
/* Userland test voor geuploade files. */
function is_uploaded_file($filename) {
    if (!
$tmp_file get_cfg_var('upload_tmp_dir')) {
        
$tmp_file dirname(tempnam(''''));
    }
    
$tmp_file .= '/' basename($filename);
    
/* Gebruikt kan slashes aan het eind hebben in php.ini... */
    
return (ereg_replace('/+''/'$tmp_file) == $filename);
}

/* Dit is hoe je het gebruiken moet, omdat je ook
 * geen move_uploaded_file() hebt in deze oudere
 * versies: */
if (is_uploaded_file($HTTP_POST_FILES['userfile'])) {
    
copy($HTTP_POST_FILES['userfile'], "/place/to/put/uploaded/file");
} else {
    echo 
"Mogelijke bestand upload aanval: bestandsnaam '$HTTP_POST_FILES[userfile]'.";
}
?>

Zie ook move_uploaded_file(), en de sectie Bestanden uploaden afhandelen voor een simpel voorbeeld.