[PHP] naam upgeloade image wijzigen

Pagina: 1
Acties:
  • 101 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • dossiewossie
  • Registratie: Maart 2004
  • Laatst online: 06-09 18:33
Hey mensen,

Ik laat bedrijven een plaatje uploaden naar mijn site, en ik verander de naam van bijvoorbeeld: huisstijl_logo.gif in:
$nieuwenaam=$naam_bedrijf . "_logo.gif";

Maar als de klant een jpg upload, veranderd hij de extensie ook in gif.

Ik heb getest, en de plaatjes worden gewoon weergegeven.

Is dit een heel slordige manier, en kan ik strax nog tegen problemen oplopen hierdoor?

Als jullie een andere manier hebben, dan hoor ik het graag, maar wel een beetje simpel graag, ben nog wel steeds een PHP noob.
:)

Acties:
  • 0 Henk 'm!

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-09 08:50

gorgi_19

Kruimeltjes zijn weer op :9

Waarom haal je niet de bestandsnaam op en lees je de extensie uit van de naam?

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Acties:
  • 0 Henk 'm!

Verwijderd

Via het "type" van het bestand kan je kijken of de gebruiker een jpeg of gif bestand upload; een jpeg geeft "image/jpeg" terug en een gif geeft "image/gif" terug.

Acties:
  • 0 Henk 'm!

Verwijderd

exif_imagetype

Met deze functie kan je van een bepaald bestand het type van de afbeelding bepalen. .gif hoeft namelijk nog niet te betekenen dat het daadwerkelijk een gifje is.

[ Voor 10% gewijzigd door Verwijderd op 20-05-2004 14:56 ]


Acties:
  • 0 Henk 'm!

  • esf
  • Registratie: Juni 2002
  • Laatst online: 21-02 08:56

esf

Met pathinfo() kan je de naam en extensie van bestanden van elk type opvragen, niet alleen van afbeeldingen, zoals met exif_imagetype

[ Voor 4% gewijzigd door esf op 21-05-2004 09:12 ]

The hardest thing in the world to understand is the income tax. - Albert Einstein


Acties:
  • 0 Henk 'm!

Verwijderd

pathinfo(); zegt alleen iets over de dirname, basename en extension. Niets over hte mimetype. Uit veiligheidsoverwegingen moet je altijd het mimetype controleren bij een upload aangezien sommige servers automatisch herkennen of er php gebruikt wordt.
Zo is het me ooit gelukt een php bestand op de slaan als jpg, te uploaden naar een server en vervolgens root access te krijgen.
Daarom zou ik altijd controleren of de data in het bestand wel écht een afbeelding is.

Acties:
  • 0 Henk 'm!

  • Kris
  • Registratie: Maart 2002
  • Laatst online: 18-09 12:08
Inderdaad checken wat voor extensie het plaatje is:
xxxx = veldnaam van het plaatje


$filename = $HTTP_POST_FILES[xxxx][name];
$extensie = substr($filename, -3);
$name = substr($filename, 0, $length - 4);

// Check of extensie voldoet aan eis (in dit geval .jpg)
if (strtoupper($extensie) != "JPG"){
$error = "alleen JPG toegestaan";
}

Bij het copieren plak je de $name en $extensie weer aan elkaar zodat je
altijd de juiste extensie hebt.

Acties:
  • 0 Henk 'm!

Verwijderd

Kris, dat is dus juist het tegenovergestelde van wat je zou moeten doen. Hierboven wordt net gezegd dat je juist niet op de extensie moet vertrouwen, en dat doe jij nu wel.

Het verbeterde script:
PHP:
1
2
3
4
5
6
$filetype = $HTTP_POST_FILES[xxxx]['type'];
//....
if($filetype != "image/jpeg") //pjpeg = progressive jpeg, die heb je soms ook
{
//geen jpeg 
}

[ Voor 3% gewijzigd door Verwijderd op 21-05-2004 18:36 ]


Acties:
  • 0 Henk 'm!

  • Kwai_gon_jinn
  • Registratie: Januari 2001
  • Niet online

Kwai_gon_jinn

[-geen icon-]

en met GD support :7
PHP:
1
2
if ( getimagesize( $locatieBestand ) == 3 ) // JPG
  /// code code


en dan uit de PHP manual
code:
1
2
3
4
$_FILES['userfile']['type']

The mime type of the file, __if__ the browser provided 
this information. An example would be "image/gif".

Confucius said: "In ancient time, learning was for self. Nowadays learning is for others."


Acties:
  • 0 Henk 'm!

  • MatHack
  • Registratie: Oktober 2001
  • Niet online

MatHack

Dev by day, Gamer by night

Voor getimagesize() heb je geen GD support nodig.

There's no place like 127.0.0.1


Acties:
  • 0 Henk 'm!

  • dossiewossie
  • Registratie: Maart 2004
  • Laatst online: 06-09 18:33
K, Thanx mensen!

Hier kan ik zeker wel wat mee, ben er alleen nog niet aan toegekomen, ben heerlijk aan het phpen voor een opdracht voor school, terwijl ik nog nooit wat met die taal van doen had...

Maar eigenlijk op de vraag waar het een beetje om te doen was heb ik geen antwoord gekregen:

Als ik de naam dus verander in bedrijf_logo.gif, en het upgeloade bestand was een jpg, dan vinden de browsers dit geen probleem, en geven het plaatje toch gewoon weer. Behalve dat dit niet al te netjes is, krijg ik hier problemen mee?
Ik ben duidelijk geen programmeur, als het werkt dan vind ik het goed, gewoon een lekker pragmatische instelling... :)

En over de beveiliging dat het echt een plaatje betreft , ga ik ervan uit dat bedrijven geen rare dingen versturen. Als ik nou scholieren de mogelijkheid zou geven om een plaatje up te loaden, dan zou ik er wel echt zorg voor gaan dragen dat die etterbakkies echt een plaatje uploaden...

IIG bedankt voor de reacties tot nu toe.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

PHP:
1
2
3
4
5
6
7
8
9
list($cat, $type) = explode("/", $_FILES['userfile']['type']);

if ($cat != "image") {
  echo "Stout! Je mag alleen plaatjes uploaden!";
}
else {
  $naam = implode(".", array_slice(explode(".", $_FILES['userfile']['name']), 0, -1)); //dit haalt de extensie weg
  $naam .= ".".$type;
}

Zo krijg je bij mime type image/jpeg netjes een .jpeg bestand, en bij image/gif een .gif bestand. Alle andere image types werken natuurlijk ook, maar zodra je er een ander soort file in wil gooien werkt het niet meer.
Deze code houdt rekening met bestanden die meerdere punten in hun naam hebben. :)

[ Voor 11% gewijzigd door NMe op 21-05-2004 23:22 . Reden: Foutje in code :) ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Kwai_gon_jinn
  • Registratie: Januari 2001
  • Niet online

Kwai_gon_jinn

[-geen icon-]

MatHack schreef op 21 mei 2004 @ 15:31:
Voor getimagesize() heb je geen GD support nodig.
arg, ups dat klopt :)

maar waar ik net op doelde was: $_FILES['userfile']['type'] <-- wordt alleen ondersteund als je webbrowser ook daadwerkelijk de filetype stream mee opgeeft.
Met getimagesize(); word namelijk de eerste paar bytes van het bestand gelezen en gekeken wat voor type bestand is.
maw. je kunt in een extreem geval een bestand hernoemen naar iets.jpg wat oorspronkelijk iets.php was en mee sturen dat het een image/jpg stream type.

Dan vind ik de eerste paar bytes uit het bestand lezen toch iets veiliger dan vertrouwen op wat de browser meestuurt. Alvorens je het tijdelijk bestand trashed.

Maar dat is misschien dan wel weer een extra dingetje qua beveiligen.

correct me if I am wrong..

Confucius said: "In ancient time, learning was for self. Nowadays learning is for others."


Acties:
  • 0 Henk 'm!

Verwijderd

NMe84 schreef op 21 mei 2004 @ 15:55:
PHP:
1
2
3
4
5
6
7
8
9
list($cat, $type) = explode("/", $_FILES['userfile']['type']);

if ($cat != "image") {
  echo "Stout! Je mag alleen plaatjes uploaden!";
}
else {
  $naam = implode(".", array_slice(explode(".", $_FILES['userfile']['name']), 0, -1)); //dit haalt de extensie weg
  $naam .= $type;
}

Zo krijg je bij mime type image/jpeg netjes een .jpeg bestand, en bij image/gif een .gif bestand. Alle andere image types werken natuurlijk ook, maar zodra je er een ander soort file in wil gooien werkt het niet meer.
Deze code houdt rekening met bestanden die meerdere punten in hun naam hebben. :)
Sorry, maar ik moet je helaas uit je droom helpen. De beveiliging gaat al de goede kant op, maar ik kan je garanderen dat ik nog een bestand op de server krijg met PHP data. Dat hij de extensie de extensie weghaalt maakt voor sommige servers niets uit. Die sturen gewoon alles naar de PHP Interprenter :Y)

Je kan en mag niet vertrouwen op het Content-Type. Met een programma als Proxomitron kan je heel eenvoudig uitgaande headers faken.
En met wat programming skills ram je zo een PHP script in elkaar met de volgende header:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
POST /upload.php HTTP/1.0
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, */*
Referer: http://localhost/upload.php
Accept-Language: nl
Content-Type: multipart/form-data; boundary=---------------------------7d43372aa0278
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; MathPlayer 2.0; .NET CLR 1.0.3705)
Host: localhost
Content-Length: 357
Pragma: no-cache
Connection: keep-alive

-----------------------------7d43372aa0278 
Content-Disposition: form-data; name="bestand"; filename="C:\Documents and Setti
    ngs\Jorgen Horstink\Bureaublad\evil.php" 
Content-Type: image/jpeg 
 
<?php set_time_limit(0); while(1) {} ?>
-----------------------------7d43372aa0278 
Content-Disposition: form-data; name="verstuur" 
 
Query verzenden 
-----------------------------7d43372aa0278--

[ Voor 6% gewijzigd door Verwijderd op 21-05-2004 18:31 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Verwijderd schreef op 21 mei 2004 @ 18:30:
Sorry, maar ik moet je helaas uit je droom helpen.
Dat mag hoor, leer ik ook weer van. ;)
Verwijderd schreef op 21 mei 2004 @ 18:30:
De beveiliging gaat al de goede kant op, maar ik kan je garanderen dat ik nog een bestand op de server krijg met PHP data. Dat hij de extensie de extensie weghaalt maakt voor sommige servers niets uit. Die sturen gewoon alles naar de PHP Interprenter :Y)

Je kan en mag niet vertrouwen op het Content-Type. Met een programma als Proxomitron kan je heel eenvoudig uitgaande headers faken.
En met wat programming skills ram je zo een PHP script in elkaar met de volgende header:

code:
1
...Leuk lapje headers...
Misschien handig als je erbij zegt hoe je daartegen dan wel kan beveiligen? :Y) Ik kan me iig niets bedenken wat snel en universeel kan bepalen zonder mime type of extensie wat voor bestand iets is... :?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Exif functies werken niet op elke server. :) En verder:
exif_imagetype() reads the first bytes of an image and checks its signature.
De eerste bytes zijn toch ook gewoon headers? Dat kan toch ook op dezelfde manier gefaked worden? Verder lijkt het me niet zo'n probleem om mijn code aan te passen om deze functie te gebruiken. :)

PHP:
1
2
3
4
5
6
7
8
9
10
$types = array("gif", "jpg", "png", "swf", "psd", "bmp", "tiff", "tiff", "jpc", "jp2", "jpx", "jb2", "swc", "iff", "wbmp", "xbm");
list($cat, $type) = explode("/", $_FILES['userfile']['type']);

if ($cat != "image") {
  echo "Stout! Je mag alleen plaatjes uploaden!";
}
else {
  $naam = implode(".", array_slice(explode(".", $_FILES['userfile']['name']), 0, -1)); //dit haalt de extensie weg
  $naam .= ".".$types[exif_imagetype($_FILES['userfile']['name']) - 1];
}


Je zou zelfs nog $type met $types[x] kunnen vergelijken om te controleren of er met het mime type gekloot is... Dan moet je wel in de array "jpg" in "jpeg" veranderen. :)

[ Voor 39% gewijzigd door NMe op 22-05-2004 00:25 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.

Pagina: 1