Foros del Web » Programando para Internet » PHP »

Problema con sistema de Upload en PHP (Solo funciona en FireFox!!??)

Estas en el tema de Problema con sistema de Upload en PHP (Solo funciona en FireFox!!??) en el foro de PHP en Foros del Web. Hola, me ocurre un problema bastante extraño, el siguiente Script es un sistema para subir archivos JPG, GIF y PNG desde el navegador, pero por ...
  #1 (permalink)  
Antiguo 11/01/2006, 07:40
(Desactivado)
 
Fecha de Ingreso: noviembre-2003
Mensajes: 34
Antigüedad: 14 años
Puntos: 0
Problema con sistema de Upload en PHP (Solo funciona en FireFox!!??)

Hola, me ocurre un problema bastante extraño, el siguiente Script es un sistema para subir archivos JPG, GIF y PNG desde el navegador, pero por alguna extraña razón, solo funciona correctamente en FireFox!!

En el Internet Explorer solo deja subir archivos GIF...

El Script lo tengo subido y funcionando aquí: www.gentetuning.com/upload/

Y este es el código fuente:

Código PHP:
<?
//set these variables-----------------------------------------------------------------
$path "varios/upload/2005/";
$max_size 500000;

//optionally
$domain $_SERVER["HTTP_HOST"];

//------------------------------------------------------------------------------------
?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>GenteTuning.COM - Upload - </title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body bgcolor="#CEAF93" text="#000000" link="#000000" vlink="#000000" alink="#000000" leftmargin="10" topmargin="10" marginwidth="10" marginheight="20">
<center>
  <p><a href="http://www.gentetuning.com/" target="_blank"><img src="logo.jpg" width="510" height="108" border="0"></a>
    <br>
    <font size="1" face="Verdana, Arial, Helvetica, sans-serif"><b>Importante:</b>
    El sistema de subida de archivos SOLO funciona con el <i><a href="http://www.mozilla.org/products/firefox/all" target="_blank">Navegador
    FireFox.<br>
    <br>
    </a></i><font size="2"><b>Los archivos que subas NO deben tener espacios en
    el nombre!!<br>
    </b></font></font></p>
  <hr>
  <FORM ENCTYPE="multipart/form-data" ACTION="index.php" METHOD="POST">
    <font face="Verdana, Arial, Helvetica, sans-serif" size="2"><strong><font size="3">Archivo
    a subir (Solo JPG, PNG o GIF): </font></strong>
    <INPUT TYPE="file" NAME="userfile" size="30">
    <INPUT TYPE="submit" VALUE="Subir Archivo!!">
    </font>
  </FORM>
  <font face="Verdana, Arial, Helvetica, sans-serif" size="2"><br>
  <?

if (!isset($HTTP_POST_FILES['userfile'])) exit;

if (
is_uploaded_file($HTTP_POST_FILES['userfile']['tmp_name'])) {

if (
$HTTP_POST_FILES['userfile']['size']>$max_size) {
        echo 
"<font color=\"#333333\" face=\"Geneva, Arial, Helvetica, sans-serif\">El archivo ocupa demasiado, por favor reducelo e intentalo de nuevo!</font><br>\n"; exit; }
if ((
$HTTP_POST_FILES['userfile']['type']=="image/jpg") || ($HTTP_POST_FILES['userfile']['type']=="image/gif") || ($HTTP_POST_FILES['userfile']['type']=="image/jpeg") || ($HTTP_POST_FILES['userfile']['type']=="image/png")) {

        if (
file_exists("../".$path $HTTP_POST_FILES['userfile']['name'])) {
                echo 
"<font color=\"#333333\" face=\"Geneva, Arial, Helvetica, sans-serif\">Lo siento, el archivo no ha sido subido, por que ya existe un archivo con el mismo nombre en el servidor,<br> por favor renombra el archivo e intenta subirlo de nuevo.</font><br>\n"; exit; }

        
$res copy($HTTP_POST_FILES['userfile']['tmp_name'], "../".$path .$HTTP_POST_FILES['userfile']['name']);

        if (!
$res) { echo "<font color=\"#333333\" face=\"Geneva, Arial, Helvetica, sans-serif\">Hay un error en el sistema, por favor haz una captura de imagen y avisa a KAYK, luego intenta de nuevo subir el archivo.</font><br>\n"; exit; } else {
        
?>
  <br>
  </font>
  <p> <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Tu archivo ha
    sido subido correctamente, esta es su URL: <strong><a href="http://<? echo $domain?>/<? echo "../".$path?><? echo $HTTP_POST_FILES['userfile']['name']; ?>" target="_blank"><br>
    <i><font size="1">http://<? echo $domain?>/<? echo $path?><? echo $HTTP_POST_FILES['userfile']['name']; ?></font></i><br>
    </a></strong><br>
    Código HTML:<br>
    <strong><i><font size="1">&lt;img src=&quot;http://<? echo $domain?>/<? echo $path?><? echo $HTTP_POST_FILES['userfile']['name']; ?>&quot;&gt;</font></i>
</strong><br>
    <br>
    Código BBCode: <strong><br>
    <font size="1"><i>[img]http://<? echo $domain?>/<? echo $path?><? echo $HTTP_POST_FILES['userfile']['name']; ?>[/img]</i></font>
</strong></font></p></center>
  <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
  <?
 
}
echo 
"<font color=\"#333333\" face=\"Geneva, Arial, Helvetica, sans-serif\"><hr>";
echo 
"Nombre: ".$HTTP_POST_FILES['userfile']['name']."<br>\n";
echo 
"Tamaño: ".$HTTP_POST_FILES['userfile']['size']." bytes<br>\n";
echo 
"Tipo: ".$HTTP_POST_FILES['userfile']['type']."<br>\n";
echo 
"Vista previa de la imagen subida:</font>";
echo 
"<br><img src=\"http://".$domain."/".$path.$HTTP_POST_FILES['userfile']['name']."\">";
} else { echo 
"<font color=\"#333333\" face=\"Geneva, Arial, Helvetica, sans-serif\">ERROR: El archivo no ha sido subido, solo está permitido subir archivos con extensión JPG, PNG y GIF!!</font><br>\n"; exit; }

}

?>
  </font>
</body>
</html>
A ver si alguien sabe donde está el problema....

Saludos y gracias de antemano!
  #2 (permalink)  
Antiguo 11/01/2006, 07:43
Avatar de Panino5001
Moderatroll
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.062
Antigüedad: 13 años, 6 meses
Puntos: 775
Probá reemplazando HTTP_POST_FILES POR $_FILES y copy por move_uploaded_file
  #3 (permalink)  
Antiguo 11/01/2006, 08:49
(Desactivado)
 
Fecha de Ingreso: noviembre-2003
Mensajes: 34
Antigüedad: 14 años
Puntos: 0
Si reemplazo todos los HTTP_POST_FILES por $_FILES y copy por move_uploaded_file

No funciona ni en Firefox ni en iExplorer... debo reemplazar solo uno de ellos? si es así dime exáctamente cual.

Gracias.
  #4 (permalink)  
Antiguo 11/01/2006, 09:03
 
Fecha de Ingreso: mayo-2003
Mensajes: 527
Antigüedad: 14 años, 6 meses
Puntos: 3
Mira a ver si poniendo al principio de la ruta de destino la carpeta raíz:

$res = copy($_FILES['userfile']['tmp_name'], $_SERVER['DOCUMENT_ROOT']."/../".$path .$_FILES['userfile']['name']);
  #5 (permalink)  
Antiguo 11/01/2006, 09:04
Avatar de claudiovega  
Fecha de Ingreso: octubre-2003
Ubicación: Puerto Montt
Mensajes: 3.667
Antigüedad: 14 años, 1 mes
Puntos: 11
A mi juicio es una cuestion de tipos mime, saca por pantalla, con echo(), el valor de esta variable $HTTP_POST_FILES['userfile']['type'] cuando subas una imagen con cada navegador para saber como se llama cada tipo mime según el navegador que uses.
  #6 (permalink)  
Antiguo 11/01/2006, 09:11
Avatar de Panino5001
Moderatroll
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.062
Antigüedad: 13 años, 6 meses
Puntos: 775
Probá adaptando esta función:
Código PHP:
function subearchivo($archivo,$archivotemp){
if(
$archivo!=''){
$foto2=md5(time()).$archivo;
move_uploaded_file($archivotemp,$foto2);
@
chmod($foto2,0755);
}
}

//y para llamar a la función:
subearchivo($_FILES['userfile']['name'],$_FILES['userfile']['tmp_name']); 
  #7 (permalink)  
Antiguo 12/01/2006, 05:10
(Desactivado)
 
Fecha de Ingreso: noviembre-2003
Mensajes: 34
Antigüedad: 14 años
Puntos: 0
Cita:
Iniciado por Tigervlc
Mira a ver si poniendo al principio de la ruta de destino la carpeta raíz:

$res = copy($_FILES['userfile']['tmp_name'], $_SERVER['DOCUMENT_ROOT']."/../".$path .$_FILES['userfile']['name']);
Si te refieres a que sustituya la siguiente linea:

$res = copy($HTTP_POST_FILES['userfile']['tmp_name'], "../".$path .$HTTP_POST_FILES['userfile']['name']);

Por esta:

$res = copy($_FILES['userfile']['tmp_name'], $_SERVER['DOCUMENT_ROOT']."/../".$path .$_FILES['userfile']['name']);

Pues no funciona... Gracias de todas formas.
  #8 (permalink)  
Antiguo 12/01/2006, 05:16
(Desactivado)
 
Fecha de Ingreso: noviembre-2003
Mensajes: 34
Antigüedad: 14 años
Puntos: 0
Cita:
Iniciado por Panino5001
Probá adaptando esta función:
Código PHP:
function subearchivo($archivo,$archivotemp){
if(
$archivo!=''){
$foto2=md5(time()).$archivo;
move_uploaded_file($archivotemp,$foto2);
@
chmod($foto2,0755);
}
}

//y para llamar a la función:
subearchivo($_FILES['userfile']['name'],$_FILES['userfile']['tmp_name']); 
Poniendo eso me da este error:

Warning: move_uploaded_file(61d39ec0aee5b889ac6a39c13eaffb0 cMOTOS.jpg): failed to open stream: Permission denied in /home/gentetun/public_html/upload/index.php on line 43

Warning: move_uploaded_file(): Unable to move '/tmp/phpheV2GN' to '61d39ec0aee5b889ac6a39c13eaffb0cMOTOS.jpg' in /home/gentetun/public_html/upload/index.php on line 43

Pero sigue funcionando el Script igual que antes (funciona en Firefox pero en iExplorer no)

En iExplorer con los archivos JPG y PNG me da este error:

ERROR: El archivo no ha sido subido, solo está permitido subir archivos con extensión JPG, PNG y GIF!!
  #9 (permalink)  
Antiguo 12/01/2006, 05:21
(Desactivado)
 
Fecha de Ingreso: noviembre-2003
Mensajes: 34
Antigüedad: 14 años
Puntos: 0
Cita:
Iniciado por claudiovega
A mi juicio es una cuestion de tipos mime, saca por pantalla, con echo(), el valor de esta variable $HTTP_POST_FILES['userfile']['type'] cuando subas una imagen con cada navegador para saber como se llama cada tipo mime según el navegador que uses.
Al subir una imagen, luego previsualiza la imágen y da los siguientes datos:

Nombre: nombre_del_archivo.jpg
Tamaño: 99999 bytes
Tipo: image/jpeg

Te refieres a eso?

La variable se muestra una vez subido el archivo, y como solo lo hace en FireFox... en iExplorer da el siguiente Error:

ERROR: El archivo no ha sido subido, solo está permitido subir archivos con extensión JPG, PNG y GIF!!

Así que en iExplorer no se que muestra, ya que si no se sube la foto, no la previsualiza, y si no la previsualiza, no muestra los datos de ella...



Si eso que alguien coja el código y le haga las modificaciones oportunas y luego lo publique aquí entero.

Que si no, nos podemos tirar dias haciendo pruebas...

Saludos y gracias.
  #10 (permalink)  
Antiguo 12/01/2006, 06:54
Avatar de claudiovega  
Fecha de Ingreso: octubre-2003
Ubicación: Puerto Montt
Mensajes: 3.667
Antigüedad: 14 años, 1 mes
Puntos: 11
Cita:
Iniciado por KAYK
Al subir una imagen, luego previsualiza la imágen y da los siguientes datos:

Nombre: nombre_del_archivo.jpg
Tamaño: 99999 bytes
Tipo: image/jpeg

Te refieres a eso?

La variable se muestra una vez subido el archivo, y como solo lo hace en FireFox... en iExplorer da el siguiente Error:

ERROR: El archivo no ha sido subido, solo está permitido subir archivos con extensión JPG, PNG y GIF!!

Así que en iExplorer no se que muestra, ya que si no se sube la foto, no la previsualiza, y si no la previsualiza, no muestra los datos de ella...
Si me refiero a eso, pero debes notar que son tus condiciones (if) las que no dejan ver la información no significa que la informacion no esté, prueba esto para que puedas ver los datos del archivo "subido", especialmente el tipo mime, luego puedes reacomodar tu codigo como antes.

Código PHP:
<?
    
//set these variables-----------------------------------------------------------------
    
$path "varios/upload/2005/";
    
$max_size 500000;

    
//optionally
    
$domain $_SERVER["HTTP_HOST"];

    
//------------------------------------------------------------------------------------
?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>GenteTuning.COM - Upload - </title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body bgcolor="#CEAF93" text="#000000" link="#000000" vlink="#000000" alink="#000000" leftmargin="10" topmargin="10" marginwidth="10" marginheight="20">
<center>
  <p><a href="http://www.gentetuning.com/" target="_blank"><img src="logo.jpg" width="510" height="108" border="0"></a>
    <br>
    <font size="1" face="Verdana, Arial, Helvetica, sans-serif"><b>Importante:</b>
    El sistema de subida de archivos SOLO funciona con el <i><a href="http://www.mozilla.org/products/firefox/all" target="_blank">Navegador
    FireFox.<br>
    <br>
    </a></i><font size="2"><b>Los archivos que subas NO deben tener espacios en
    el nombre!!<br>
    </b></font></font></p>
  <hr>
  <FORM ENCTYPE="multipart/form-data" ACTION="index.php" METHOD="POST">
    <font face="Verdana, Arial, Helvetica, sans-serif" size="2"><strong><font size="3">Archivo
    a subir (Solo JPG, PNG o GIF): </font></strong>
    <INPUT TYPE="file" NAME="userfile" size="30">
    <INPUT TYPE="submit" VALUE="Subir Archivo!!">
    </font>
  </FORM>
  <font face="Verdana, Arial, Helvetica, sans-serif" size="2"><br>

<?

    
if (!isset($HTTP_POST_FILES['userfile'])) exit;

    if (
is_uploaded_file($HTTP_POST_FILES['userfile']['tmp_name']))
    {
        echo 
"Nombre: ".$HTTP_POST_FILES['userfile']['name']."<br>\n";
        echo 
"Tamaño: ".$HTTP_POST_FILES['userfile']['size']." bytes<br>\n";
        echo 
"Tipo: ".$HTTP_POST_FILES['userfile']['type']."<br>\n";
        echo 
"Vista previa de la imagen subida:</font>";
        if (
$HTTP_POST_FILES['userfile']['size']>$max_size)
        {
            echo 
"<font color=\"#333333\" face=\"Geneva, Arial, Helvetica, sans-serif\">El archivo ocupa demasiado, por favor reducelo e intentalo de nuevo!</font><br>\n";
            exit;
        }
        if ((
$HTTP_POST_FILES['userfile']['type']=="image/jpg") || ($HTTP_POST_FILES['userfile']['type']=="image/gif") || ($HTTP_POST_FILES['userfile']['type']=="image/jpeg") || ($HTTP_POST_FILES['userfile']['type']=="image/png"))
        {
            if (
file_exists("../".$path $HTTP_POST_FILES['userfile']['name']))
            {
                echo 
"<font color=\"#333333\" face=\"Geneva, Arial, Helvetica, sans-serif\">Lo siento, el archivo no ha sido subido, por que ya existe un archivo con el mismo nombre en el servidor,<br> por favor renombra el archivo e intenta subirlo de nuevo.</font><br>\n";
                exit;
            }

            
$res copy($HTTP_POST_FILES['userfile']['tmp_name'], "../".$path .$HTTP_POST_FILES['userfile']['name']);

            if (!
$res)
            {
                echo 
"<font color=\"#333333\" face=\"Geneva, Arial, Helvetica, sans-serif\">Hay un error en el sistema, por favor haz una captura de imagen y avisa a KAYK, luego intenta de nuevo subir el archivo.</font><br>\n";
                exit;
            }
            else
            {
?>
  <br>
  </font>
  <p> <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Tu archivo ha
    sido subido correctamente, esta es su URL: <strong><a href="http://<? echo $domain?>/<? echo "../".$path?><? echo $HTTP_POST_FILES['userfile']['name']; ?>" target="_blank"><br>
    <i><font size="1">http://<? echo $domain?>/<? echo $path?><? echo $HTTP_POST_FILES['userfile']['name']; ?></font></i><br>
    </a></strong><br>
    Código HTML:<br>
    <strong><i><font size="1">&lt;img src=&quot;http://<? echo $domain?>/<? echo $path?><? echo $HTTP_POST_FILES['userfile']['name']; ?>&quot;&gt;</font></i>
</strong><br>
    <br>
    Código BBCode: <strong><br>
    <font size="1"><i>[img]http://<? echo $domain?>/<? echo $path?><? echo $HTTP_POST_FILES['userfile']['name']; ?>[/img]</i></font>
</strong></font></p></center>
  <font face="Verdana, Arial, Helvetica, sans-serif" size="2">

<?
             
}
            echo 
"<font color=\"#333333\" face=\"Geneva, Arial, Helvetica, sans-serif\"><hr>";

            echo 
"<br><img src=\"http://".$domain."/".$path.$HTTP_POST_FILES['userfile']['name']."\">";
        }
        else
        {
            echo 
"<font color=\"#333333\" face=\"Geneva, Arial, Helvetica, sans-serif\">ERROR: El archivo no ha sido subido, solo está permitido subir archivos con extensión JPG, PNG y GIF!!</font><br>\n";
            exit;
        }

    }

?>
</font>
</body>
</html>
PD: se recomienda usar move_uploaded_file() en lugar de copy().
  #11 (permalink)  
Antiguo 12/01/2006, 07:26
(Desactivado)
 
Fecha de Ingreso: noviembre-2003
Mensajes: 34
Antigüedad: 14 años
Puntos: 0
Acabo de probar y en iExplorer dice esto:

Tipo: image/pjpeg

Ese es el problema, no? Que solución tiene? Gracias!
  #12 (permalink)  
Antiguo 12/01/2006, 14:33
Avatar de claudiovega  
Fecha de Ingreso: octubre-2003
Ubicación: Puerto Montt
Mensajes: 3.667
Antigüedad: 14 años, 1 mes
Puntos: 11
Agregar esa comparacion en tu if.

if (($HTTP_POST_FILES['userfile']['type']=="image/jpg") || ($HTTP_POST_FILES['userfile']['type']=="image/gif") || ($HTTP_POST_FILES['userfile']['type']=="image/jpeg") || ($HTTP_POST_FILES['userfile']['type']=="image/png") ||
($HTTP_POST_FILES['userfile']['type']=="image/pjpeg"))

Puedes usar esta forma que es mas corta en el if:

$image_types = array('image/jpeg', 'image/pjpeg', 'image/jpg','image/gif','image/png');

if (in_array($_FILES['userfile']['type'], $image_types)) {

}
  #13 (permalink)  
Antiguo 12/01/2006, 14:44
(Desactivado)
 
Fecha de Ingreso: noviembre-2003
Mensajes: 34
Antigüedad: 14 años
Puntos: 0
Muchas gracias!

Ahora ya funciona perfectamente en iExplorer y en Firefox! :)

También añadí el x-png :)
  #14 (permalink)  
Antiguo 12/01/2006, 14:46
(Desactivado)
 
Fecha de Ingreso: noviembre-2003
Mensajes: 34
Antigüedad: 14 años
Puntos: 0
Por cierto, como podría hacer que los archivos que se suban con espacios en el nombre, automáticamente los renombre poniendole "_", ejemplo:

Si subo: "esto es una foto.jpg"
Que el Script lo suba y lo renombre a: "esto_es_una_foto.jpg"
  #15 (permalink)  
Antiguo 12/01/2006, 20:48
Avatar de claudiovega  
Fecha de Ingreso: octubre-2003
Ubicación: Puerto Montt
Mensajes: 3.667
Antigüedad: 14 años, 1 mes
Puntos: 11
$nombre="esto es una foto.jpg";
$nombre=str_replace(" ","_",$nombre);
echo $nombre;
  #16 (permalink)  
Antiguo 13/01/2006, 08:22
 
Fecha de Ingreso: enero-2006
Ubicación: Buenos Aires, Argentina
Mensajes: 299
Antigüedad: 11 años, 11 meses
Puntos: 5
Te paso un consejo que me dieron una vez. No conviene confiar en los Mime-types, porque no son muy difíciles de alterar/trampear. No sé cómo se hace, pero después también lo leí en otro lado. Para validar la extensión, es mejor tomar el nombre del archivo (que incluye la extensión), y fijarse que las últimas 3 letras sean "jpg", "gif", "png" (o lo que necesites subir).

Ojo, porque que te suban cualquier archivo es potencialmente peligroso. Pensá que si alguien consiguiera subir al servidor un script php después lo podría ejecutar con el navegador. Y ese archivo podría ser inofensivo o borrarte todo el sitio... En fin, no es para crear paranoia, pero sí para que tomes todos los recaudos necesarios.

Suerte
  #17 (permalink)  
Antiguo 13/01/2006, 08:40
Avatar de alexjnm  
Fecha de Ingreso: octubre-2004
Ubicación: cuba
Mensajes: 218
Antigüedad: 13 años, 1 mes
Puntos: 1
De acuerdo

hola
hasta hace poco tenia e mismo problema lo que te pido desir es que puedes utilisar una clase para subir ficheros esta en phpclasses y se llama asi class_upload_php es facil de utilisar y simple

te pongo un ejemplo para que ves que es facil
Código PHP:
<?
require("class.upload.php");
$fileup = new Upload($_FILES['file']);

    if (
$fileup->uploaded) {
        
//camino donde deseas guardar los ficheros que se suban
    
$fileup->Process("../");
}
?>
cuando lo bajes ella trae un ejemplo mas completo con manejo de errores
espero que te sirba

saludo alex
__________________
__________________________________________________ _________
A beses el camino mas largo es la solución mas eficaz :)
  #18 (permalink)  
Antiguo 13/01/2006, 08:41
 
Fecha de Ingreso: enero-2006
Ubicación: Buenos Aires, Argentina
Mensajes: 299
Antigüedad: 11 años, 11 meses
Puntos: 5
Por si a alguno le interesa, en este artículo se explica justamente este tema:

http://addict3d.org/index.php?page=v...curity&ID=1075

Copio la conclusión:

Conclusion
In conclusion I really have nothing to say except for I think this is a huge security issue that many php coders overlook when making a file upload. File uploads are used in everything from forum avatars to free web hosts and I am sure many many of these scripts contain this flaw. To protect your scripts from this type of attack there is no way around it but to check the file extension instead of using the mime type. Enjoy.
  #19 (permalink)  
Antiguo 13/01/2006, 09:41
Avatar de claudiovega  
Fecha de Ingreso: octubre-2003
Ubicación: Puerto Montt
Mensajes: 3.667
Antigüedad: 14 años, 1 mes
Puntos: 11
No lei el articulo, pero a primera vista me parece que es mas facil renombrar un archivo que cambiar su estructura interna, aunque hoy en día hay herramientas para todo.
  #20 (permalink)  
Antiguo 13/01/2006, 11:28
 
Fecha de Ingreso: enero-2006
Ubicación: Buenos Aires, Argentina
Mensajes: 299
Antigüedad: 11 años, 11 meses
Puntos: 5
Pero el problema no es el nombre del archivo o la extensión en sí, ni la estrucura interna, porque el asunto es que, justamente, el archivo puede ser código php, pero el mime-type puede estar "disfrazado" como "images/jpg", por ejemplo. Le hace creer al script que es una imagen, pero NO es una imagen; no hay ningún cambio en la estructura interna del archivo; es el mismo.

Supongamos que alguien hace un script que te borra todo el sitio (vi ejemplos en páginas sobre seguridad en php y con una línea de código alcanza). Supongamos que lo llama "borrar.php", pero para subirlo lo renombra como "borrar.jpg". Bien, en ese caso, si vos validás por extensión, el script va a subirse al servidor.

Pero la diferencia importante es que no va a poder ejecutarse directamente. O sea, sí podés poner en la barra del navegador "http://www.dominio.com/borrar.jpg", pero el script no se va a ejectuar.

En cambio, si esa misma persona te subiera ese archivo como "borrar.php", no desde tu formulario sino con una aplicación programada para "dibujar" el mime-type y hacerle creer al servidor que es una imagen, después de subirlo podría ejecutarlo inmediatamente y borrarte todo.

El tema es que como el mime-type es una dato que viene del cliente, en principio no es confiable. (Obvio que lo más probable es que todo ande bien, pero haciéndolo de esta manera, estás dando la posibilidad de que hagan lo que quieran en tu servidor...)

Es decir, lo más seguro es validar por extensión, no por mime-type. Es más un poco más largo y engorroso, pero la otra forma es potencialmente peligrosa.

Y otra cuestión directamente relacionada con ésta es tener mucho cuidado con los includes/require. En lo posible, deberían estar "harcodeados", o sea, no ser variables (y son son variables, hay fijarse muy bien que no dejen "huecos" para que alguien desde afuera manipule arbitrariamente el valor de esa variable).

Porque include hace que se ejecute código php, no importa que extensión tenga el archivo. Si el que te subió el archivo descubre algún lugar de tu aplicación donde hacés un include($variable) y vos dejaste la posibilidad de manipular esa variable, tranquilamente podría hacer que include($variable) terminara ejecutándose como include("borrar.jpg").

Bueno, cada uno lo hace como más le gusta o prefiere, pero me parece que estas cosas hay que saberlas y tenerlas en cuenta.

Saludos
Califa

Última edición por califa010; 13/01/2006 a las 11:50
  #21 (permalink)  
Antiguo 04/03/2006, 14:54
(Desactivado)
 
Fecha de Ingreso: noviembre-2003
Mensajes: 34
Antigüedad: 14 años
Puntos: 0
Entonces que debería modificar del script para que sea seguro?
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:09.