27. juni 2004 - 22:01Der er
14 kommentarer og 3 løsninger
bestem filtyppe ved upload via web
Hejsa!
Jeg kan ved hjælp af --- kode --- if ($pics4 != 'none') { $fileext = GetImageSize($pics4); $fileext = $fileext[2]; --- kode --- bestemme hvilke typpe fil det er man uploader
Desværre kan jeg ikke finde noget som gør det samme for andre fil typper - her tænker jeg mere bestemt på .pdf .txt .doc evt. .htm(l)
Nogen der har en upload funktion til at tjekke hvilken fil det er brugeren forsøger at uploade ?
Man kan ikke bruge $_FILES['upfile']['type'] til noget. Enhver hacker kan sætte "image/gif" på en .php fil, og så har man uploadet et script til en fremmed server. Reelt kan man kun checke på extension.
function UploadFil($MAX_FILE_SIZE,$fil,$link_navn,$fil_besk) { global $respons_msg; $created = time(); sql("insert into files (id,menu_id,headline,fil_navn,fil,tekst,sort,oprettet,aktiv) values ('','','','$link_navn','','$fil_besk','','$created','0')"); $file_id = mysql_insert_id(); if ($fil != 'none') { // Bestem hvilke fil-typpe der uploades. $fil1 = "file"; $fil2 = "_"; $fil3 = "$file_id"; $file4 = "."; $fil5 = "???"; // det er her extensionen på filen skal være $filnavn = "$fil1$fil2$fil3$file4$fil5"; copy($fil, "/html/$filnavn"); sql("update files set fil = '$filnavn' where id = '$file_id'"); $respons_msg = "Filen er uploadet"; } } --- kode ---
Problemet er at hvis jeg blot angiver $fil til sidst i copy(..... functionen så får jeg en fejl hvor filen efter fejlen at dømme heder noget ala "phpxxxxx"
Ville ellers mene at det ville uploade filen med det navn som der stod i feltet "fil" fra formularen.....
Så det er altså extensionen på den fil der kommer ind på serveren fra formularens felt "fil" og som kan / må være .pdf .txt .doc .htm(l) filer
Så det jeg gerne vil have er en function som undersøger den uploadede fil for hvilke extension den har, da jeg omdøber alle uploadede filer til at hede file_ID nummer fra db.orginale extension
nu er filnavnet jo rimeligt usikkert, at bruge til at afgøre dokumenttypen udfra. hvis ellers din server understøtter det (mange gør desværre ikke), kan du bruge funktionen : mime_content_type()
Jo, såmænd, men man får ikke noget ud af det. Ideen i det har hacking, jeg hele tiden skriver om, er at uploade et billede til et katalog, så serveren tror det er et billede på mime-typen, men filen hedder fx xxx.php, og derfor kan udføres på serveren.
Den medsendte mime-type er blot hvad klienten (browseren) mener typen bør være.
funktionen mime_content_type() fungerer på en fil. det er ikke det samme som at checke $_FILES['userfile']['type'] derfor er mime_content_type ikke noget en hacker kan kompromittere.
Jo, da, han kan da bare lave en fil med de rigtige bytes i starten, kalde den .php, og længere nede starte en <?...?> - du skal ikke undervurdere hackere.
ja bevares, men det er nu også lidt mere kompliceret end blot at fake mime-type sendt med filen. kombineret med et check på filendelse burde det jo være ok. men du har ret - det havde jeg ikke lige tænkt på.
hvad jeg mente med "usikkert" var ikke så meget møntet på hackere, men snarere på hvordan han skal håndtere filen. det var mit indtryk, at det var det han spurgte til.
Hvis man laver et check på måde mime-typen og sørger for at der ikke kan uploades filer med andre extensions end eks. .gif eller .jpg, vil det være sikkert?
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.