Como validar UPLOAD de imagenes correctamente

Iniciado por Skeletron, 19 Abril 2010, 04:45 AM

0 Miembros y 2 Visitantes están viendo este tema.

Skeletron

Hola gente.
En mi sitio web se puede subir imagenes, y me pregunto si éste codigo es suficiente para validar que los archivos que se estan subiendo no serán utilizados para realizar algun ataque a la web:

Código (php) [Seleccionar]
if(substr($_FILES['imagen']['type'],strlen($_FILES['imagen']['type'])-4)=='jpeg'){
//subir archivo
}

Castg!

podrias usar la libreria GD, entonces pueden subir cualquier tipo de imagenes (a cualquier tipo me refiero a png, gif o jpg :p jeje) pero no importa el tipo que suban, siempre te las guarda en el servidor con extension jpeg. entonces, como las abre, las decodifica, las vuelve a codificar (pero esta vez siempre en jpeg), si habian subido un archivo .php ya no sirve. hoy toy aburrido asi que te dejo el code xD

Código (php) [Seleccionar]

function imagecreatefromimg ($flotaImage) {
$tipo = getimagesize($flotaImage);
switch ($tipo['mime']) {
case "image/jpeg":
$finalImage = imagecreatefromjpeg($flotaImage);
break;
case "image/png":
$finalImage = imagecreatefrompng($flotaImage);
break;
case "image/gif":
$finalImage = imagecreatefromgif($flotaImage);
break;
default:
die("Tipo de imagen no válida.");
break;
}
return $finalImage;
}
$imagen = imagecreatefromimg($_FILES['imagen']['tmp_name']);
$directorioImagen = 'imagenes/'.$_FILES['imagen']['name'].'.jpg';
imagejpeg($imagen, $directorioImagen); //guardamos la imagen en el directorio imagenes.
imagedestroy($imagen);


Listo :D. Funciona, yo lo comprobe ;)
Cualquier error o duda pregunta!!
Saludos!!

Skeletron

Mira..
Yo valido la iamgen así:
(porque tambien la redimenciono)

Código (php) [Seleccionar]
if(substr($_FILES['imagen']['type'],strlen($_FILES['imagen']['type'])-4)=='jpeg'){
$aux=imagecreatefromjpeg($_FILES['imagen']['tmp_name']);
$ancho=imagesx($aux);
$alto=imagesy($aux);
if($ancho>400){
$divisor=($ancho / 400);
$ancho=($ancho / $divisor);
$alto=($alto / $divisor);
}
if($alto>400){
$divisor=($alto / 400);
$alto=($alto / $divisor);
$ancho=($ancho / $divisor);
}

$dst_img=imagecreatetruecolor($ancho, $alto);
//400px x 400px es el tamaño maximo
imagecopyresampled($dst_img, $aux, 0,0,0,0, $ancho, $alto, imagesx($aux), imagesy($aux));

imagejpeg($dst_img,'img/'.$_SESSION['id'].'.jpg');
unlink($_FILES['imagen']['tmp_name']);
imagedestroy($dst_img);

$errorsubir='La imagen, ha sido subida correctamente';

}else{
$errorsubir='El archivo no ha sido subido. Solo puede ser .jpg<br>Vuelva a intentarlo con otra imagen';
}
return $errorsubir;
}


Que me dices de ese codigo?

Castg!

hubieses dicho que usabas GD xD me ahorraba el tiempo :P jejej, igual me gusta programar ;) mira, tu codigo esta joya, ahora, no conozco mucho (ya que no lo trabajo) el valor ['type']. nose si se puede trucar o algo asi... mira, en si, tu code es mezcla de lo mio, porq el tuyo, como bien, guarda la imagen como jpeg, y la redimensiona bien.

ahora si te interesa, podes mezclar mi code con el tuyo, para que el usuario tenga la posibilidad de subir archivos png y gif, junto a jpeg; redimensiones y la guardes como jpeg. eso es cuestion tuya, en si, confio un poco mas en el "getiomagesize()" y "$tipo['mime']" pero me parece que es exactamente lo mismo. ahora queda cuestion tuya, tu pregunta fue resuelta. Tu codigo esta bien. un saludo ;)

Skeletron

Perfecto amigo.

Veré si puedo convinar todo entonces... :D

Castg!

Ya que estamos ;-)


Código (php) [Seleccionar]
function imagecreatefromimg ($flotaImage) {
$tipo = getimagesize($flotaImage);
switch ($tipo['mime']) {
case "image/jpeg":
$finalImage = imagecreatefromjpeg($flotaImage);
break;
case "image/png":
$finalImage = imagecreatefrompng($flotaImage);
break;
case "image/gif":
$finalImage = imagecreatefromgif($flotaImage);
break;
default:
die("Tipo de imagen no válida.");
break;
}
return $finalImage;
}
$aux = imagecreatefromimg($_FILES['imagen']['tmp_name']);
$ancho=imagesx($aux);
$alto=imagesy($aux);
if($ancho>400){
$divisor=($ancho / 400);
$ancho=($ancho / $divisor);
$alto=($alto / $divisor);
}
if($alto>400){
$divisor=($alto / 400);
$alto=($alto / $divisor);
$ancho=($ancho / $divisor);
}
$dst_img=imagecreatetruecolor($ancho, $alto);
//400px x 400px es el tamaño maximo
imagecopyresampled($dst_img, $aux, 0,0,0,0, $ancho, $alto, imagesx($aux), imagesy($aux));
$directorioImagen = 'img/'.$_SESSION['id'].'.jpg';
imagejpeg($dst_img, $directorioImagen); //guardamos la imagen en el directorio imagenes.
imagedestroy($dst_img);
if(file_exist($directorioImagen) { echo "Imagen procesada exitosamente"; }else{ echo "Error al procesar la imagen"; }

Skeletron