Avatar billede blach Nybegynder
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"&Oslash;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&aelig;lg en eller flere filer til upload!";
    }else{
      echo "<BR>Filerne er uploadet!";
    }

}
?>
Avatar billede jaw Nybegynder
16. juli 2004 - 13:40 #1
Du kan bruge:

$filetyper = array("image/gif", "image/jpeg", "image/pjpeg", "image/png");
if (!in_array($_FILES['upfile']['type'][$i], $filetyper)) {
  //ok
}
Avatar billede jaw Nybegynder
16. juli 2004 - 13:41 #2
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

:)
Avatar billede blach Nybegynder
16. juli 2004 - 13:54 #3
ok.. hvordan skal jeg få det ind i mit script?
Avatar billede jaw Nybegynder
16. juli 2004 - 13:58 #4
Tror det må være noget i stil med:

//FLERE FILER PÅ SAMME TID

if (isset($_FILES["upfile"])) {

echo"&Oslash;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&aelig;lg en eller flere filer til upload!";
    }else{
      echo "<BR>Filerne er uploadet!";
    }

}
?>
Avatar billede blach Nybegynder
16. juli 2004 - 14:23 #5
ok... du kan ikke også sætte et max loft for kb?
f.eks. max 120 kb per billede...
Avatar billede jaw Nybegynder
16. juli 2004 - 14:26 #6
Ja, så må den vist se ca. sådan ud:

//FLERE FILER PÅ SAMME TID

if (isset($_FILES["upfile"])) {

echo"&Oslash;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&aelig;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...
Avatar billede blach Nybegynder
16. juli 2004 - 14:30 #7
Mange tak!
Du har ikke en webserver vi kan teste det på?
bare slet det med databasen...
Avatar billede jaw Nybegynder
16. juli 2004 - 14:31 #8
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...
Avatar billede blach Nybegynder
16. juli 2004 - 14:34 #9
ok, jeg prøver lige at teste det...
Avatar billede blach Nybegynder
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...
Avatar billede jaw Nybegynder
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...
Avatar billede blach Nybegynder
16. juli 2004 - 14:56 #12
ok, jeg prøver .. tak for hjælpen so far
Avatar billede blach Nybegynder
16. juli 2004 - 14:58 #13
Hmm det virker fint.. der er noget i vejen med det max sjov
Avatar billede jaw Nybegynder
16. juli 2004 - 15:00 #14
Prøvede du uden at ændre $maxsize = "100000" ?
Avatar billede jaw Nybegynder
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 <
Avatar billede blach Nybegynder
16. juli 2004 - 15:04 #16
det er koden fra 13:58:10. som virkede..
prøver lige med det du skrev...
Avatar billede jaw Nybegynder
16. juli 2004 - 15:05 #17
Ja, det passer så til koden 14:26:13
Avatar billede blach Nybegynder
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" ???
Avatar billede jaw Nybegynder
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 :)
Avatar billede blach Nybegynder
16. juli 2004 - 15:08 #20
OK.. god ferie :]
Avatar billede blach Nybegynder
16. juli 2004 - 15:08 #21
hvad kører du med af maxsize i dit script?
Avatar billede blach Nybegynder
16. juli 2004 - 15:10 #22
Tror det er sådan her:
$kb*1024)/1000
Avatar billede erikjacobsen Ekspert
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.
Avatar billede blach Nybegynder
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"&Oslash;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&aelig;lg en eller flere filer til upload!";
    }else{

    }

}
?>
Avatar billede erikjacobsen Ekspert
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.
Avatar billede coderdk Praktikant
16. juli 2004 - 16:40 #26
Eller bedre, brug getimagesize() - hvis den fejler er det ikke et billede ;)
Avatar billede blach Nybegynder
16. juli 2004 - 16:44 #27
Okay.. nu bliver det avanceret :]

Kan I ikke prøve at bruge det med min kode?
Avatar billede coderdk Praktikant
16. juli 2004 - 16:48 #28
if ( getimagesize( $_FILES['upfile']['tmp_name'] ) && $_FILES['upfile']['size'][$i] < $maxsize ) {
Avatar billede erikjacobsen Ekspert
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.
Avatar billede coderdk Praktikant
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...
Avatar billede erikjacobsen Ekspert
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.
Avatar billede blach Nybegynder
17. juli 2004 - 17:26 #32
ok.. men jaw får pointene, scriptet virker fint...
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