16. juli 2004 - 13:38
Der er
31 kommentarer og 1 løsning
Upload skal tjekke om det er billede-filer
Mit upload script kan uploade op til 3 filer på en gang. Men hvordan tjekker jeg disse filer? Så det kun er billede filer? (jpg/gif eller hvad man ellers bruger?) Min kode er her: <?php //stien, hvortil filer skal uploades, her et subdir til roden af domænet $dist = "/home/www/html/filer/"; //FLERE FILER PÅ SAMME TID if (isset($_FILES["upfile"])) { echo"Ønskede filer til upload:<p>\n"; $antal = 0; //Find antallet af filer til upload med en for-løkke for($i = 0; $i < count($_FILES["upfile"]["name"]); $i++) { if ($_FILES["upfile"]["name"][$i] !="") { //Læg en til $antal for hver fil. $antal++; if(is_uploaded_file($_FILES["upfile"]["tmp_name"][$i])) { move_uploaded_file($_FILES["upfile"]["tmp_name"][$i], $dist . $_FILES["upfile"]["name"][$i]); //til brug for info om filtyper $str1 = $_FILES["upfile"]["name"][$i]; $str2 = $_FILES["upfile"]["size"][$i]; $str3 = $_FILES["upfile"]["type"][$i]; //gemmer oplysninger i databasen open(); $insertSQL = "INSERT INTO filer (fil_navn, type, size) values ('$str1', '$str3', '$str2')"; mysql_query($insertSQL); close(); echo $str1 ." er blevet uploadet!<BR>"; }else{ echo"Upload til serveren skete ikke!"; } } } if($antal < 1) { //Hvis der ingen filer er valgt echo"Husk at vælg en eller flere filer til upload!"; }else{ echo "<BR>Filerne er uploadet!"; } } ?>
Annonceindlæg fra Computerworld
Du kan bruge: $filetyper = array("image/gif", "image/jpeg", "image/pjpeg", "image/png"); if (!in_array($_FILES['upfile']['type'][$i], $filetyper)) { //ok }
Lige en ! for meget... $filetyper = array("image/gif", "image/jpeg", "image/pjpeg", "image/png"); if (in_array($_FILES['upfile']['type'][$i], $filetyper)) { //ok } ovenstående er: //ikke ok :)
ok.. hvordan skal jeg få det ind i mit script?
Tror det må være noget i stil med: //FLERE FILER PÅ SAMME TID if (isset($_FILES["upfile"])) { echo"Ønskede filer til upload:<p>\n"; $antal = 0; $filetyper = array("image/gif", "image/jpeg", "image/pjpeg", "image/png"); //Find antallet af filer til upload med en for-løkke for($i = 0; $i < count($_FILES["upfile"]["name"]); $i++) { if ($_FILES["upfile"]["name"][$i] !="") { //Læg en til $antal for hver fil. $antal++; if (in_array($_FILES['upfile']['type'][$i], $filetyper)) { if(is_uploaded_file($_FILES["upfile"]["tmp_name"][$i])) { move_uploaded_file($_FILES["upfile"]["tmp_name"][$i], $dist . $_FILES["upfile"]["name"][$i]); //til brug for info om filtyper $str1 = $_FILES["upfile"]["name"][$i]; $str2 = $_FILES["upfile"]["size"][$i]; $str3 = $_FILES["upfile"]["type"][$i]; //gemmer oplysninger i databasen open(); $insertSQL = "INSERT INTO filer (fil_navn, type, size) values ('$str1', '$str3', '$str2')"; mysql_query($insertSQL); close(); echo $str1 ." er blevet uploadet!<BR>"; }else{ echo"Upload til serveren skete ikke!"; } } else { echo"Filtypen ikke tilladt til upload..."; } } } if($antal < 1) { //Hvis der ingen filer er valgt echo"Husk at vælg en eller flere filer til upload!"; }else{ echo "<BR>Filerne er uploadet!"; } } ?>
ok... du kan ikke også sætte et max loft for kb? f.eks. max 120 kb per billede...
Ja, så må den vist se ca. sådan ud: //FLERE FILER PÅ SAMME TID if (isset($_FILES["upfile"])) { echo"Ønskede filer til upload:<p>\n"; $antal = 0; $filetyper = array("image/gif", "image/jpeg", "image/pjpeg", "image/png"); $maxsize = "100000"; //Find antallet af filer til upload med en for-løkke for($i = 0; $i < count($_FILES["upfile"]["name"]); $i++) { if ($_FILES["upfile"]["name"][$i] !="") { //Læg en til $antal for hver fil. $antal++; if (in_array($_FILES['upfile']['type'][$i], $filetyper) && $_FILES['upfile']['size'][$i] > $maxsize) { if(is_uploaded_file($_FILES["upfile"]["tmp_name"][$i])) { move_uploaded_file($_FILES["upfile"]["tmp_name"][$i], $dist . $_FILES["upfile"]["name"][$i]); //til brug for info om filtyper $str1 = $_FILES["upfile"]["name"][$i]; $str2 = $_FILES["upfile"]["size"][$i]; $str3 = $_FILES["upfile"]["type"][$i]; //gemmer oplysninger i databasen open(); $insertSQL = "INSERT INTO filer (fil_navn, type, size) values ('$str1', '$str3', '$str2')"; mysql_query($insertSQL); close(); echo $str1 ." er blevet uploadet!<BR>"; }else{ echo"Upload til serveren skete ikke!"; } } else { echo"Filtypen ikke tilladt til upload eller den er for stor..."; } } } if($antal < 1) { //Hvis der ingen filer er valgt echo"Husk at vælg en eller flere filer til upload!"; }else{ echo "<BR>Filerne er uploadet!"; } } ?> $maxsize kan du så regne dig til... den er vist sat til 100 kb så vidt jeg husker...
Mange tak! Du har ikke en webserver vi kan teste det på? bare slet det med databasen...
Naah, jeg tager ud af landet om et par timer, så det kan jeg ikke lige nå :) Men et script der er MEGET tæt på det der, bruger jeg selv på en af mine sites. Altså maxsize og filetype-arrayet...
ok, jeg prøver lige at teste det...
16. juli 2004 - 14:52
#10
Hmm, den uploader ikke og siger samme tid (ved upload af en fil på 5 kb): Ønskede filer til upload: Filtypen ikke tilladt til upload eller den er for stor... Filerne er uploadet! Vil du se link? så smid en mail...
16. juli 2004 - 14:54
#11
Jeg har ikke tid til mere, skal med et fly 16.55. Men prøv at gå tilbage og check om det virkede i min kommentar 13:58:10. Hvis det gør, så må du arbejde videre derfra... Hvis ikke, så skal det indsættes anderledes... Beklager jeg ikke kan hjælpe mere :/ God sommer...
16. juli 2004 - 14:56
#12
ok, jeg prøver .. tak for hjælpen so far
16. juli 2004 - 14:58
#13
Hmm det virker fint.. der er noget i vejen med det max sjov
16. juli 2004 - 15:00
#14
Prøvede du uden at ændre $maxsize = "100000" ?
16. juli 2004 - 15:01
#15
Tror jeg har fundet fejlen: Find den her linie: if (in_array($_FILES['upfile']['type'][$i], $filetyper) && $_FILES['upfile']['size'][$i] > $maxsize) { og ret den til: if (in_array($_FILES['upfile']['type'][$i], $filetyper) && $_FILES['upfile']['size'][$i] < $maxsize) { Altså en > til en <
16. juli 2004 - 15:04
#16
det er koden fra 13:58:10. som virkede.. prøver lige med det du skrev...
16. juli 2004 - 15:05
#17
Ja, det passer så til koden 14:26:13
16. juli 2004 - 15:06
#18
Det virker... men også for godt! for den siger ikek stop til den fil på 500 KB.. er du sikker på at der skal stå $maxsize = "100000" ???
16. juli 2004 - 15:07
#19
Du må prøve dig lidt frem, måske skal tallet sættes ned... Men som sagt bliver jeg nødt til at smutte til lufthavnen. Håber du får det til at virke :)
16. juli 2004 - 15:08
#20
OK.. god ferie :]
16. juli 2004 - 15:08
#21
hvad kører du med af maxsize i dit script?
16. juli 2004 - 15:10
#22
Tror det er sådan her: $kb*1024)/1000
16. juli 2004 - 15:18
#23
Man kan desværre ikke nøjes med at bruge filtype, såsom image/jpeg, da enhver
hacker vil kunne sætte den, og alligevel upload fx en PHP-fil. Ligger der så en
PHP-fil i image-kataloget, har han pludselig kontrol over din server (fiktivt
eksempel:
http://www.mitdomæne.dk/billeder/billede.php )
Du er derfor nødt til også at checke på extension. Selv om der står php-kode
i en .jpg-fil vil serveren jo ikke udføre det.
16. juli 2004 - 15:45
#24
OK, kan du hjælpe med det? Min kode er nu <?php //stien, hvortil filer skal uploades, her et subdir til roden af domænet $dist = "/home/web/php00002/uploadtest/"; //FLERE FILER PÅ SAMME TID if (isset($_FILES["upfile"])) { echo"Ønskede filer til upload:<p>\n"; $antal = 0; $filetyper = array("image/gif", "image/jpeg", "image/pjpeg", "image/png"); $maxsize = "102400"; //Find antallet af filer til upload med en for-løkke for($i = 0; $i < count($_FILES["upfile"]["name"]); $i++) { if ($_FILES["upfile"]["name"][$i] !="") { //Læg en til $antal for hver fil. $antal++; if (in_array($_FILES['upfile']['type'][$i], $filetyper) && $_FILES['upfile']['size'][$i] < $maxsize) { if(is_uploaded_file($_FILES["upfile"]["tmp_name"][$i])) { move_uploaded_file($_FILES["upfile"]["tmp_name"][$i], $dist . $_FILES["upfile"]["name"][$i]); //til brug for info om filtyper $str1 = $_FILES["upfile"]["name"][$i]; $str2 = $_FILES["upfile"]["size"][$i]; $str3 = $_FILES["upfile"]["type"][$i]; echo $str1 ." er blevet uploadet!<BR>"; }else{ echo"Upload til serveren skete ikke!"; } } else { echo"Filtypen ikke tilladt til upload eller den er for stor..."; } } } if($antal < 1) { //Hvis der ingen filer er valgt echo"Husk at vælg en eller flere filer til upload!"; }else{ } } ?>
16. juli 2004 - 15:46
#25
Det ser ud til du skal tjekke på ekstension i $str1 dvs. $_FILES["upfile"]["name"][$i] Du kan lave en liste over lovlige extensions, og gøre som du gør med typen.
16. juli 2004 - 16:40
#26
Eller bedre, brug getimagesize() - hvis den fejler er det ikke et billede ;)
16. juli 2004 - 16:44
#27
Okay.. nu bliver det avanceret :] Kan I ikke prøve at bruge det med min kode?
16. juli 2004 - 16:48
#28
if ( getimagesize( $_FILES['upfile']['tmp_name'] ) && $_FILES['upfile']['size'][$i] < $maxsize ) {
16. juli 2004 - 17:28
#29
Det er faktisk muligt at snyde med imagesize. Man kalder filen xxx.php, lægger bytes fra et lille gif-billede forrest, og skriver så <? ...en masse php-kode... ?> bagefter. Mig bekendt vil getimagesize så give noget fornuftigt, men det er og bliver et php-script. Man skal checke på extension - der er ingen anden vej.
16. juli 2004 - 18:33
#30
erikjacobsen, Hmm ja, det har du egentlig ret i, men i stedet for at vedligeholde en lang(? ja ok hehe) liste af billedtyper, kunne man nægte .php...
16. juli 2004 - 18:37
#31
Klart - plus alle de andre scriptsprog der er på serveren, og som evt kunne blive tilføjet i fremtiden. Jeg ville foretrække en positiv liste, og der er altså ikke så mange ;) Men jeg laver det ikke for spørgeren - jeg gør blot opmærksom på et ofte overset sikkerhedshul.
17. juli 2004 - 17:26
#32
ok.. men jaw får pointene, scriptet virker fint...
Vi tilbyder markedets bedste kurser inden for webudvikling