Este upload es seguro?

Iniciado por RicRed, 29 Octubre 2012, 18:34 PM

0 Miembros y 1 Visitante están viendo este tema.

RicRed

Hola a los usuarios del foro, este upload de imagenes por db seria seguro?

Código (php) [Seleccionar]
<?PHP
    $conexion = mysql_connect("localhost", "root", "123456");
    mysql_select_db("dbimages", $conexion);
if (isset($_POST['enviar']))
{
$tipos = array("image/gif","image/jpeg","image/bmp","image/pjpeg");
$maximo = 1000000; //1000Kb
if (is_uploaded_file($_FILES['imagen']['tmp_name']))
{ // Se ha subido?
if (in_array($_FILES['imagen']['type'],$tipos) && $_FILES['imagen']['size'] <= $maximo)
{ // Es correcto?
$fp = fopen($_FILES['imagen']['tmp_name'], 'r'); //Abrimos la imagen
$imagen = fread($fp, filesize($_FILES['imagen']['tmp_name'])); //Extraemos el contenido de la imagen
$imagen = addslashes($imagen);
fclose($fp); //Cerramos imagen
if(!get_magic_quotes_gpc())
$nombre = addslashes($_FILES['imagen']['name']); // Arreglamos el Nombre
else $nombre = $_FILES['imagen']['name'];

$query = "INSERT INTO imagenes (imagen,nombre,tipo,descripcion,fecha,ip) VALUES ";
$query.= "('".$imagen."','".$nombre."','".$_FILES['imagen']['type']."','";
$query.= $_POST['descripcion']."','";
$query.= date("d/m/y",time())."','".$_SERVER['REMOTE_ADDR']."')";

if (mysql_query($query)) echo '<a href="visor.php?mostrar='.mysql_insert_id().'">';
else echo mysql_error();
} else echo "El formato del archivo no es correcto o es mayor de 100Kb";
} else echo "La imagen no ha sido subida";
}
//Desconexion DB
?>

[u]nsigned

1) No es para nada recomendable guardar la imagen en forma binaria dentro de la DD.BB, vas a sobrecargar tu server. Mejor solo guarda el path como una cadena de texto.

2)Antes de copiar la imagen de la carpeta temporal de subida ($_FILES['imagen']['tmp_name']) a su ubicacion final, es recomendable revisar que se trate efectivamente de una imagen con la funcion getimagesize. Mas que nada para evitar RFI/LFI. Si dicha funcion devuelve false es que el archivo proporcionado por el usuario no se trata realmente de una image, independientemente de su extenision/mime-type ;)

Saludos

No hay atajo ante la duda, el misterio se hace aquí...
Se hace carne en cada uno, el misterio es existir!

RicRed

#2
seria mejor subir las imagenes en una carpeta con la funcion getimagesize, para evitar que suban shells al sistema.

Otra cosa, este codigo que se encuentra en esta web:

http://www.marcofbb.com.ar/upload-de-imagenes/

Seria seguro? no subiran archivos php o shells al sistema?

Codigo:

Código (php) [Seleccionar]
<?php 
// V2
$varrand substr(md5(uniqid(rand())),0,10);
$varallw = array("image/bmp","image/gif","image/jpeg","image/pjpeg","image/png","image/x-png");
$tips = array("bmp","gif","jpeg","png","jpg");
$varpath "http://samples.unijimpe.net/imagehosting.php?image=";
$varstat "";
 
if (
$_POST["action"] == "upload") {
if (is_uploaded_file($_FILES["imagen"]["tmp_name"])) {
$varname $_FILES["imagen"]['name'];
$vartemp $_FILES['imagen']['tmp_name'];
$vartype $_FILES['imagen']['type'];

if (in_array($vartype$varallw) && $varname != "") {
$arrname explode("."$varname);
$i strtolower(end($arrname));
if(in_array($i$tips)){
$varname $varrand.".".$i;
if (copy($vartemp"tmp/".$varname)) {
$varpath $varpath.$varname;
$varstat "ok";
} else {
$varstat "Error al subir el archivo";
}
} else { $varstat "Archivo no valido"; }
} else {
$varstat "Archivo no valido";
}
}
}
?>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>PHP ImageHosting - unijimpe</title>
<link href="cssupload.css" rel="stylesheet" type="text/css" />
</head>
<body>
<table width="420" border="0" align="center" cellpadding="0" cellspacing="0">
  <tr>
    <td width="413" height="40" class="titulo">PHP ImageHosting - unijimpe - <a href="http://www.entra-ya.com.ar/">entra-ya</a> </td>
  </tr>
  <tr>
    <td class="text">Aloja gratuitamente tus imagenes con PHP ImageHosting:</td>
  </tr>
  <tr>
  <form action="imagehosting.php" method="post" enctype="multipart/form-data">
    <td height="50" valign="top" class="text">
      <input name="imagen" type="file" class="casilla" id="imagen" size="35" />
      <input name="enviar" type="submit" class="boton" id="enviar" value="Upload Image" />
  <input name="action" type="hidden" value="upload" />   </td>
</form>
  </tr>
  <?php if ($varstat == "ok") { ?>
  <tr>
    <td class="textinf"><strong>Confirmaci&oacute;n:</strong><br>
Archivo publicado satisfactoriamente. Puedes utilizar las siguientes opciones para enlazarlo:<br>
<strong>Enlace HTML:</strong> <br>
<input name='txt1' type='text' value='<a href="<?php echo $varpath?>"><img src="<?php echo $varpath?>" border="0" /></a>' size='60'>
<br>
<strong>Enlace Directo: </strong><br>
<input name='txt2' type='text' value='<?php echo $varpath?>' size='60'></td>
  </tr>
  <?php } else { ?>
  <?php if ($varstat != "") { ?>
  <tr>
<td class="textinf"><strong>Error:</strong><br>
    <?php echo $varstat?>&nbsp;</td>
  </tr>
  <?php ?>
  <?php ?>
</table>
<?php if ($varstat == "ok") { ?>
<p align="center"><img src="tmp/<?php echo $varname?>"></p>
<?php ?>
<?php if ($_GET['image'] != "") { ?>
<p align="center"><img src="tmp/<?php echo $_GET['image']; ?>"></p>
<?php ?>
</body>
</html>


Saludos.

[u]nsigned

No usa getimagesize, por lo estas en lo mismo, solo revisa la extension del archivo, asi que es facil colarle una shell. Pero es no tan dificil imaginar como implementarle eso al mismo, unas 4 o 5 lineas de codigo.... :silbar:

No hay atajo ante la duda, el misterio se hace aquí...
Se hace carne en cada uno, el misterio es existir!

gowend

Prueba con estas lineas de código, sabiendo que ya esta abierta una conexión a mysql:


<?php
// Ya iniciada la conexion, recibimos datos de un form
$id $_POST['id'];

$nombres $_FILES['foto']['name'];

$ruta_temp $_FILES['foto']['tmp_name'];

$rutaN "img/".$nombres;

$array_ext = array("png","gif","jpg","GIF","JPG","Gif","Jpg","Png","PNG");

$ext pathinfo($nombres);

if (
is_uploaded_file($ruta_temp))
{
        if (
array_search($ext['extension'],$array_ext))
        {
                
copy($ruta_temp,$rutaN);
                
                
mysql_query("UPDATE registro SET imagen= '$rutaN' WHERE id ='$id'; ");

        }else{

                echo 
"Solo formato de imagenes: Gif, Jpg, Png";
                
                
print_r ($ext['extension']);

        }
 }else{
        die (
"Escoja una imagen");
 }
?>

Gowend132 El conocimiento es LIBRE!!!