Avatar billede asgrone Nybegynder
15. marts 2005 - 11:55 Der er 24 kommentarer og
1 løsning

tjekke om en fil er jpeg, mac og pc

Hej
Jeg bruger dette uploadscript:
//filupload - variabler
$filtype = ".jpg";
$filnavn = time();
$uploaddir = '../kalender_billeder/';
$error = "kunne ikke uploade billedet";
//uploader
$uploadfile = $uploaddir . $filnavn . $filtype;
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
} else {
print "$error";
die;
}
men jeg vil gerne tjekke om filen er et jpg billede, får jeg uploader det, hvordan gør jeg det lettest? Den skal både tjekke om det er jpg til mac (images/jpeg) og pc (images/pjpeg).
Avatar billede bromer Nybegynder
15. marts 2005 - 11:59 #1
Du kan jo se på hvad du får udleveret i $_FILES. I $_FILES['userfile']['type'] ligger Mime typen.
Avatar billede coderdk Praktikant
15. marts 2005 - 12:01 #2
pjpeg står for "Progressive JPEG", og har intet at gøre med PC/MAC ;)
Du skal checke extension, og du kan så også checke mime-typen...
Avatar billede bromer Nybegynder
15. marts 2005 - 12:04 #3
Vær opmærksom på at både Mime-typen og extension'en ikke er 100% sikre til typeangivelse.

Hvis du benytter PHP på en Unix maskine kan med med større sikkerhed benytte file [1] til at angive typen. http://www.die.net/doc/linux/man/man1/file.1.html
Avatar billede coderdk Praktikant
15. marts 2005 - 12:09 #4
Det er så ikke nødvendigt, du kan blot gøre sådan:

if ( ( $info = @getimagesize( $filnavn ) ) !== false )
{
  if ( preg_match( '-image/p?jpeg-', $info['mime'] ) )
  {
      // billedet er gyldigt og er af typen (p)jpeg
  }
  else
  {
      // Det er et billede, men ikke et (p)jpeg
  }
}
else
{
  // Det er ikke et billede
}
Avatar billede coderdk Praktikant
15. marts 2005 - 12:10 #5
Bemærk at du stadig bør checke extension ;-)
Avatar billede bromer Nybegynder
15. marts 2005 - 12:12 #6
coderdk: Nu er det muligt at snyde med hensyn til hvilken Mimetype der angives og hvorfor dog undersøge extension? Jeg kan sagtens have et billede hvis extension ikke stemmer overens med hvad man normalt regner med at være JPEG extension.

Den eneste måde man kan være sikker på, hvilken type en fil har er ved rent faktisk at undersøge indholdet, ligesom file gør.
Avatar billede coderdk Praktikant
15. marts 2005 - 12:17 #7
bromer, Nej du kan ikke snyde (rigtigt) med mime typen med getimagesize - Den loader billedet, så du får kun image/jpeg hvis den kan loade billedet som et jpeg.
Man bør checke extension hvis man gemmer med samme extension, f.eks. kan jeg sende en php-fil med image/jpeg mime-typen.
Avatar billede coderdk Praktikant
15. marts 2005 - 12:18 #8
M.a.o. det er netop det som getimagesize() gør ;)
Avatar billede bromer Nybegynder
15. marts 2005 - 12:23 #9
Men hvorfor dog undersøge extension når du er villig til at køre getimagesize. Om du får .php fil er vel ligemeget hvis det er et gyldigt billede?
Avatar billede coderdk Praktikant
15. marts 2005 - 12:26 #10
bromer, Jeg mente bare at tidligere kunne man konkatenere et billede og en jpeg, og getimagesize ville godtage det - Men hvis du så kaldte det ville koden blive kørt - Men jeg har lige testet og det kan man heldigvis ikke længere :) getimagesize() fejler i min test hvis du har prøvet at narre den ;-)
Så extensiontest er ikke nødvendig!
Avatar billede coderdk Praktikant
15. marts 2005 - 12:26 #11
Og et svar herfra ;)
Avatar billede erikjacobsen Ekspert
15. marts 2005 - 12:27 #12
coder.dk har helt ret. Hvis du får uplodet noget med mime-type som billede, som som getimagesize eller tilsvarende siger er et billede, men som har extension .php, så
kan det billede sagtens indeholde PHP-kode, der så kan udføres. Billedet bliver måske
lagt i en mappe, der er direkte tilgængelig, og så har du tilladt fremmede at uploade scripts til din server. Det er ikke godt. Du kommer *ikke* udenom også at checke extension.
Avatar billede bromer Nybegynder
15. marts 2005 - 12:27 #13
Jeg antager du mente at man kontatenerede kode og en jpeg ikke?
Avatar billede bromer Nybegynder
15. marts 2005 - 12:30 #14
men hvordan pokker kan getimagesize så retunere at det er et okay billede? Det er jo et problem hvis funktionen udelukkende ser på Mimetypen og ikke på om billedet rent faktisk er gyldigt.

Derudover kan man jo altså lægge sine billeder et sted hvor man ikke kan ramme dem udefra. Så behøver man ikke at undersøge extension...
Avatar billede erikjacobsen Ekspert
15. marts 2005 - 12:32 #15
Hvis billederne ikke kan "ses" udefra, er det ikke et problem. men hvad glæde har man så af dem.

Getimagesize/file undersøger ikke hele filen, men checker nogle bytes i begyndelsen (og måske lidt mere). De kan sagtens snydes.

Hvad nu med at gøre det oplagte: når billeder uploades gør man det til en vane at huske at checke extensions. Så er det gjort.
Avatar billede bromer Nybegynder
15. marts 2005 - 12:35 #16
Det er klart at det ikke er et problem at undersøge extension, men jeg holder virkelig fast i troen om at det ikke er nødvendigt.

For det første kan filer som umiddelbart ikke kan "rammes" udefra vel godt bruges idet PHP kan finde dem. Eventuelt kan man jo lave et display script der viser billederne.

Derudover var jeg rent faktisk i den tro at file lavede et bedre valideringsarbejde end kun at undersøge start-bytes.
Avatar billede bromer Nybegynder
15. marts 2005 - 12:35 #17
som en konklusion tror jeg efterhånden vi er ganske enige om hvad man kan og ikke kan..
Avatar billede erikjacobsen Ekspert
15. marts 2005 - 12:39 #18
Ja, du sagtens servere "skjulte" billeder vha et PHP-script. Men det er ikke sikkert
du altid kan og vil belaste serveren ekstra, så en dag laver du det om, eller tager en kopi til andet formål, og så er der ikke check for extension, og så har du et hul.

Jeg er sådan set ligeglad - det er bare et godt råd for at undgå bøvl.

Og så kunne det være interessant at se hvor mange af de store sites man kan snyde på den måde - men det er jo hacking, så det er bestemt ikke en opfordring... ;)
Avatar billede bromer Nybegynder
15. marts 2005 - 12:42 #19
Det var nu ikke fordi jeg ikke selv ville undersøge extension, men derfor kan man jo godt (for debatens skyld) være lidt på tværs.

Og jeg synes generelt der er rigtig mange sites der har været ofre for SQL-injections og andre mindre heldige huller. Mon ikke der også er en del man kan fucke på denne måde :)
Avatar billede coderdk Praktikant
15. marts 2005 - 12:51 #20
Jeg har som sagt lige testet ved at konkatenere et jpegbillede og noget phpkode, den ville getimagesize() ikke godtage - så jeg antager at det problem der har været ikke er der længere, og at man dermed kan undgå at teste på extension - Men det kan aldrig skade jo :)
Avatar billede bromer Nybegynder
15. marts 2005 - 12:53 #21
Man kunne skrive en valideringsfunktion som undersøgte at der var tale om et jpeg billede hele vejen igennem :) Men det er nok at skyde en smule over målet.
Avatar billede erikjacobsen Ekspert
15. marts 2005 - 12:53 #22
Du kan intet konkludere ud fra det eksperiment. Du har prøvet een, ganske vist, oplagt ting, og det virker så ikke. Tror du ikke, der er andre muligheder, og tror du at en hacker giver op så let? Du forsøger vel ikke at lave sikre websites i dit arbejde eller din fritid ;) ?
Avatar billede sukos Juniormester
15. marts 2005 - 14:07 #23
Du kan gøre så'n her: (fjern blot alle andre end 2 => jpg i $billed_typer, for kun at uploade jpg filer)


<?php

// Ved ikke stien er korrekt?
$path = $_SERVER["DOCUMENT_ROOT"] ."/kalender_billeder/";

if(isset($_FILES["upfile"]) && trim($_FILES["upfile"]["name"]) !="") {

    if(true == ($str = getimagesize($_FILES["upfile"]["tmp_name"]))) {

    $billed_typer = array(1 => "gif", 2 => "jpg", 3 => "png");
    $flip_typer = array_flip($billed_typer);

        if(in_array($str[2], $flip_typer)) {

        $filtype = end(explode(".", $_FILES["upfile"]["name"]));
        $filnavn = substr($_FILES["upfile"]["name"], 0, (strlen($_FILES["upfile"]["name"])-strlen($filtype)));

        $newname = strtolower($filnavn);

        $bad = "\'*^´`+}{][£!§½%¤#=¨áàãââçéèêëìíîïñòóôõöùúûüýÿ?,\"/";
        for($i = 0; $i < strlen($bad); $i++) {
        $newname = str_replace($bad[$i], "", $newname);
        }

        $replace = array("æ" => "ae", "ø" => "oe", "å" => "aa", " " => "_");

        $newname = $newname . strtr($str[2], $billed_typer);

        move_uploaded_file($_FILES["upfile"]["tmp_name"], $path . $newname);

        echo "Filen ". $newname ." er uploadet";

        }else{
        echo"Forkert billed-type!!!";
        }
    }else{
    echo"Kun billedfiler kan uploades!";
    }

} else {

?>

<form action="<?php echo $_SERVER["PHP_SELF"]; ?>" method="post" enctype="multipart/form-data">

Fil:<br><input type="file" name="upfile"> <input type="submit" value="Upload">
</form>

<?php
}
?>
Avatar billede sukos Juniormester
15. marts 2005 - 14:13 #24
Hov, der manglede jo lige det med æ,ø og å


<?php

$path = $_SERVER["DOCUMENT_ROOT"] ."/kalender_billeder/";

if(isset($_FILES["upfile"]) && trim($_FILES["upfile"]["name"]) !="") {

    if(true == ($str = getimagesize($_FILES["upfile"]["tmp_name"]))) {

    $billed_typer = array(2 => "jpg");
    $flip_typer = array_flip($billed_typer);

        if(in_array($str[2], $flip_typer)) {

        $filtype = end(explode(".", $_FILES["upfile"]["name"]));
        $filnavn = substr($_FILES["upfile"]["name"], 0, (strlen($_FILES["upfile"]["name"])-strlen($filtype)));

        $newname = strtolower($filnavn);

        $bad = "\'*^´`+}{][£!§½%¤#=¨áàãââçéèêëìíîïñòóôõöùúûüýÿ?,\"/";
        for($i = 0; $i < strlen($bad); $i++) {
        $newname = str_replace($bad[$i], "", $newname);
        }

        $dk_tegn = array("æ" => "ae", "ø" => "oe", "å" => "aa", " " => "_");
        $newname = strtr($newname, $dk_tegn);
        $newname = $newname . strtr($str[2], $billed_typer);

        move_uploaded_file($_FILES["upfile"]["tmp_name"], $path . $newname);

        echo "Filen ". $newname ." er uploadet";

        }else{
        echo"Forkert billed-type!!!";
        }
    }else{
    echo"Kun billedfiler kan uploades!";
    }

} else {

?>

<form action="<?php echo $_SERVER["PHP_SELF"]; ?>" method="post" enctype="multipart/form-data">

Fil:<br><input type="file" name="upfile"> <input type="submit" value="Upload">
</form>

<?php
}
?>
Avatar billede asgrone Nybegynder
15. marts 2005 - 14:44 #25
øh, jeg siger tak.. jeg er ikke helt med på alle detaljerne i jeres diskution, men jeg bruger coder.dk's kode, så jeg giver point'sne til ham..
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