Avatar billede labisama Nybegynder
22. februar 2009 - 17:40 Der er 10 kommentarer og
1 løsning

Tjekke filetype ved upload fejler

Hej

Jeg laver følgende filtype tjek ved et upload-script:

else if ($_FILES['file']['type'] != "image/gif" || $_FILES['file']['type'] != "image/jpg" || $_FILES['file']['type'] != "image/jpeg" || $_FILES['file']['type'] != "image/pjpeg" || $_FILES['file']['type'] != "image/png") {

echo "Ugyldig filtype!<br><br>Det er kun muligt at uploade filer af typerne: JPEG, GIF eller PNG.";

Nogle som kan fortælle mig hvorfor at jeg får fejlmeddelelsen?

Fjerner jeg hele else if-sætningen, så bliver filen fint uploaded osv.

På forhånd tak,
Avatar billede olebole Juniormester
22. februar 2009 - 18:36 #1
<ole>

Du har naturligvis forsøgt at skrive:
  echo "Filens type: ".$_FILES['file']['type']."<br>\r\n";

- så nu er jeg bare nysgerrig efter at få at vide, hvad den test gav af resultat  =)

/mvh
</bole>
Avatar billede labisama Nybegynder
22. februar 2009 - 18:56 #2
Ja det har jeg selvfølgelig.

Den skriver image/jpeg, med den billedfil jeg prøver med.
Avatar billede olebole Juniormester
22. februar 2009 - 19:12 #3
Mon ikke du skulle bruge '&&' i stedet for '||'. Hvis filen er af typen 'image/jpeg', er der jo med garanti noget, der er opfyldt i betingelsen.

Betingelsen skal jo kun være opfyldt hvis type er forskellig fra 'image/jpeg' og forskellig fra 'image/gif' og  forskellig fra 'image/png' ... osv  ;o)
Avatar billede erikjacobsen Ekspert
22. februar 2009 - 19:20 #4
Dit test er selvfølgelig ok, men ikke nok. Det er meget nemt at upload en PHP-fil, med navnet etellerandet.php som en image/jpg.

Hvis de uploadede filer er direkte tilgængelig, så har en hacker fri adgang til dit site.

Du skal derfor yderligere kontrollere at filen har en extension, som er ok med dig, og dermed afvise .php filer.
Avatar billede labisama Nybegynder
22. februar 2009 - 19:35 #5
Ole >

If-sætningen tjekker netop om filerne IKKE er nogle af de ovenstående typer.

Så jeg burde vel godt kunne lave det på den her måde? Men forstår bare ikke hvorfor der kommer fejl?

#4 > Tak for tippet. Det skal jeg huske.
Avatar billede erikjacobsen Ekspert
22. februar 2009 - 19:40 #6
Du forstår ikke hvorfor der skal stå &&. Kig her




if ($tal!=1 || $tal!=2) { print "fejl"; }

Hvis tallet er 1, er $tal!=2 sandt.
Hvis tallet er 2, er $tal!=1 sandt.
Hvis tallet er hvad som helst andet, er begge sande.

Derfor vil du altid komme ind i if-sætningen. Det er det samme med din if-sætning.

Det rigtige vil være:

if ($tal!=1 && $tal!=2) { print "fejl"; }

Eller ved kun at apørge positivt:

  if ($tal==1 || $tal==2) {
    // ok
  } else {
    print "fejl";
  }
Avatar billede labisama Nybegynder
22. februar 2009 - 19:48 #7
Ja det kan jeg godt se nu.

Tak for hjælpen!

Svar til jer begge tak´.
Avatar billede erikjacobsen Ekspert
22. februar 2009 - 20:02 #8
Ingen point til mig, tak.
Avatar billede olebole Juniormester
22. februar 2009 - 20:06 #9
I stedet for at spørge på MIME typen, kan du spørge på filens extension. Det er mere sikkert, da du ikke kan afvikle en PHP-fil med navnet *.png. Princippet er:

<?php

$allowedExts = array(
    "jpg" => 1,
    "jpeg" => 1,
    "gif" => 1,
    "png" => 1
);

$filename = "filnavn.jpg"; // Filens navn
$ext = explode(".", $filename);
$ext = end($ext); // Filens extension

if ($allowedExts[$ext]) {
    print "Filen har en tilladt extension.";
}

?>
Avatar billede olebole Juniormester
22. februar 2009 - 20:08 #10
Så vidt jeg husker, findes der i PHP en funktion, der kan returnere en fils extension direkte, men jeg husker ikke ligenu, hvad den hedder. Derfor konstruktionen:

$ext = explode(".", $filename);
$ext = end($ext); // Filens extension

=)
Avatar billede olebole Juniormester
22. februar 2009 - 20:56 #11
Tak for points  =)
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