10. september 2004 - 13:45Der er
7 kommentarer og 1 løsning
Sikkerhed ved fil upload
Har lavet en side, hvor brugere kan uploade et billede til deres profil.
Jeg har lavet følgende tjek i denne rækkefølge, for at sikre sitet mest muligt:
1. Lagt upload dir udenfor roden, så biblioteket ikke kan tilgåes via browseren...
2. Tjekker filstørrelsen ikke overstiger 2mb.
3. Derefter tjekker jeg filens mime type, så jeg kun modtager jpg og gif filer. >> Hvis dette godkendes, uploades billedet. 4. Jeg tjekker med getimagesize(), at det rent faktisk er et billede da mime type kan forfalskes. Hvis ikke, sletter jeg filen.
Mangler jeg noget, eller er tiltagene tilstrækkelige?
Forfalsker man mime-typen, uploader en fil med navnet x.php, og sætter de bytes forrest som får getimagesize til at svare korrekt, så har man en php-fil på din server. Den ligger så godt nok udenfor webroden, og kan ikke udføres, men alligevel: check også at extension er blandt dem du vil have.
Her er min kode, du/andre er velkommen til at kommentere den og evt. komme med forslag til forbedringer.
------------------------------------------------------------------------- if (isset($_POST['wantimage'])) //if user wants own image then... { /***** image upload code begins *****/ if(($_FILES["upfil"]["size"] > 0) || ($_FILES['upfile']['name'] != "")) //if filesize above 0 or filename longer than zer0 { $configuration["upload_dir"] = "/domains/www.luckystar.dk/memberprofileimages"; //where to put images $configuration["max_size"] = "2500"; //kilobytes
// Move from where to... $from = $_FILES["upfil"]["tmp_name"]; $to = $configuration["upload_dir"] . "/" . $_FILES["upfil"]["name"];
// Filesize accepted? $file_size = filesize($from)/1024; if($file_size > $configuration["max_size"]) { echo('<script type=\'text/javascript\'>alert(\'FEJL: Filen er for stor.\n\nMax størrelsen er '. $configuration["max_size"] .' kb,\nog dit billede fylder '. ceil($file_size) .' kb.\');</script>'); exit(); }
//checks mime type of file $mimetype = array("image/gif", "image/jpeg", "image/pjpeg"); if (in_array($_FILES['upfil']['type'], $mimetype)) { //all good... } else { echo('<script type=\'text/javascript\'>alert(\'FEJL: Filen er ikke af typen .jpg eller .gif!\n\nFind venligst et billede af denne type,\neller undlad at uploade et profilbillede nu.\');</script>'); exit(); }
//Checks files original ending $file_extension = strrchr($_FILES["upfil"]["name"], "."); if ($file_extension == ".jpg" || $file_extension == ".gif" || $file_extension == ".jpeg") { $memberimage = time()."_".$_SESSION['memberid'].$file_extension; } else { echo('<script type=\'text/javascript\'>alert(\'FEJL: Filendelsen er ikke .jpg, .jpeg eller .gif!\n\nFind venligst et billede af denne type,\neller undlad at uploade et profilbillede nu.\');</script>'); exit(); }
//Places the file in the specified upload directory.... if(function_exists("move_uploaded_file")) { $filename = $configuration["upload_dir"] . "/" . time()."_".$_SESSION['memberid'].$file_extension; move_uploaded_file($_FILES['upfil']['tmp_name'], $filename); } else { copy($from, $to); }
//Checks image height/width/type... If false, then it's not an image and will be deleted (unlinked) $result_array = getimagesize($filename); if($result_array == FALSE) { unlink($filename); echo('<script type=\'text/javascript\'>alert(\'FEJL: Filen er ikke et billede!\');</script>'); exit(); } } else //if no picture has been selected or filesize equals 0 { echo('<script type=\'text/javascript\'>alert(\'FEJL: Du har ikke valgt et billede!\');</script>'); exit(); } /***** image upload code ends *****/ } else //if user wants no image uploaded { $memberimage = "noimage.jpg"; //inserted to db } -------------------------------------------------------------------------
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.