Avatar billede andersdp Nybegynder
10. september 2004 - 13:45 Der 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?
Avatar billede erikjacobsen Ekspert
10. september 2004 - 13:48 #1
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.
Avatar billede andersdp Nybegynder
10. september 2004 - 14:22 #2
Jep, det lyder som en ok idé at tilføje den del også.

Ellers kan man vel ikke gøre ret meget mere?
Avatar billede erikjacobsen Ekspert
10. september 2004 - 14:27 #3
Joh, men kan derudover lægge dem til manuel kontrol, før de bliver brugt til noget ;)
Men derudover kan jeg umiddelbart ikke se mere.
Avatar billede andersdp Nybegynder
10. september 2004 - 14:59 #4
Det skal de faktisk :)

Så siger jeg tak, smid et svar.
Avatar billede erikjacobsen Ekspert
10. september 2004 - 15:09 #5
Nej tak, jeg samler slet ikke på point. Svar selv, og accepter eget svar.
Avatar billede andersdp Nybegynder
10. september 2004 - 15:12 #6
Fair nok :)
Avatar billede andersdp Nybegynder
10. september 2004 - 15:13 #7
Jeg poster lige min kode lidt senere, så kan du lige se den og andre kan måske drage nytte af den...
Avatar billede andersdp Nybegynder
12. september 2004 - 21:42 #8
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
    }
-------------------------------------------------------------------------
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester