Foros del Web » Programando para Internet » PHP »

Para probar: Script FTP

Estas en el tema de Para probar: Script FTP en el foro de PHP en Foros del Web. Hola a todos. Ahora mismo estoy diseñando en mi web de skate una especie de navegador de archivos que cada usuario puede usar para subir ...
  #1 (permalink)  
Antiguo 09/10/2003, 08:50
Avatar de El Menda  
Fecha de Ingreso: junio-2001
Ubicación: Jaén
Mensajes: 516
Antigüedad: 22 años, 10 meses
Puntos: 0
Para probar: Script FTP

Hola a todos. Ahora mismo estoy diseñando en mi web de skate una especie de navegador de archivos que cada usuario puede usar para subir sus imágenes y para que pueda crear cada uno sus carpetas.
Me gustaría que lo probarais y me dijerais qué os ha parecido. Por supuesto que podeis hacer modificaciones :), y si encontrais algún fallo o quereis mejorar el script comentadlo por favor.
Iré corrigiendo aquí los fallos
Creo que está todo claro. A ver que os parece:
Código PHP:
<?
#Nombre del directorio. Debe acabar en /
$directorio="archivote/";
#Tamaño máximo de los archivos a subir
$tamano_kb 1000;
#Página con vista previa
$vista "ver.php";

#Extensiones para subir archivos (separadas por espacios)
$extensiones "gif jpg png bmp";

///////////////////////////////////////////
/////SCRIPT/////
//Se requiere PHP 4.1.0 o superior
//Características php.ini (comentarios entre corchetes)
//register_globals = Off [puedes ponerlo en On]
//file_uploads = On [ponlo como está aquí
//;upload_tmp_dir = [dejalo comentado si quieres]
//upload_max_filesize = 2M [pon el número de megas máximos para subir. En mi caso 1 M]
///////////////////////////////////////////
#Inserta el header HTML
    
function header_html() {
echo 
"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">
<HTML>
<HEAD>
<TITLE>Navegador FTP by Menda</TITLE>
</HEAD>
<BODY>
"
;
    }

#Inserta el footer HTML
    
function footer_html() {
echo 
"
</BODY>
</HTML>"
;
    }

#Calcula tamaño directorio
function dirsize($checkdir) { 
    
$dh opendir($checkdir); 
    
$size 0
    while ((
$file readdir($dh)) !== false
        if (
$file != "." and $file != "..") { 
            
$path $checkdir."/".$file
            if (
is_dir($path)) 
                
$size += dirsize($path); 
            elseif (
is_file($path)) 
                
$size += filesize($path); 
        } 
    
closedir($dh); 
 
$formated_size $size /1000
    return 
$formated_size
}

#Si no existe directorio lo crea
  
if (isset($_GET['dsub'])) {
$directorio $_GET['dsub']."/";
  } else {
  if(! 
is_dir($directorio)) {
mkdir($directorio,0777);
  }
  }

#Divide las extensiones
$extensione split(" "," ".$extensiones);

#Mensajes de redirección
 
if (empty($_POST['subir']) AND empty($_POST['borrar']) AND empty($_POST['imagen']) AND empty($_POST['carpeta']) AND empty($_GET['directorio'])) {
echo 
header_html(); //Insertamos header HTML
  
switch ($_GET['id']) {
case 
1:
$mensaje="<font color=\"green\">El archivo fue subido con éxito.</font>";
break;
case 
2:
$mensaje="<font color=\"red\">Error al intentar subir el archivo.</font>";
break;
case 
3:
$mensaje="<font color=\"red\">El archivo sobrepasa el límite de ".$tamano_kb." kbs.</font>";
break;
case 
4:
$mensaje="<font color=\"red\">Tipo de archivo no válido.</font>";
break;
case 
5:
$mensaje="<font color=\"blue\">Archivo (".$_GET["borrado"].") eliminado correctamente.</font>";
break;
case 
6:
$mensaje="<font color=\"green\">Carpeta (".$_GET["carpeta"].") creada correctamente.</font>";
break;
case 
7:
$mensaje="<font color=\"red\">La carpeta (".$_GET["carpeta"].") ya existe.</font>";
break;
  }

echo 
"<form enctype=\"multipart/form-data\" action=\"".$_SERVER['PHP_SELF']."\" method=\"post\">";
#Pasar variable con subdirectorio
  
if (isset($_GET['dsub'])) {
echo 
"<input type=\"hidden\" name=\"posicion\" value=\"".$_GET['dsub']."\">";
  }
echo 
"
Seleccionar archivo: <input name=\"archivo_usuario\" type=\"file\"><br>
<input type=\"submit\" name=\"subir\" value=\"Subir archivo\">
</form>\n"
;
echo 
"<br>
<form method=\"post\" action=\""
.$_SERVER['PHP_SELF']."\">";
  if (isset(
$_GET['dsub'])) {
echo 
"<input type=\"hidden\" name=\"posicion\" value=\"".$_GET['dsub']."\">";
  }
echo 
"
Crear nueva carpeta: <input name=\"carpeta\" type=\"text\">
<input type=\"submit\" value=\"Nueva carpeta\">
</form>
"
;
#Se muestra mensaje (si hay)
   
if (isset($mensaje)) {
 echo 
"<br><b>".$mensaje."</b><br><br>";
   }
 echo 
"Leyendo directorio: ".$directorio;
 if (isset(
$_GET['dsub'])) {
echo 
"<br><a href=\"".$_SERVER['PHP_SELF']."\">Volver</a>";
 }
#Lectura de directorios
$d dir($directorio);
$i 0;
echo 
"
<table width=\"400\">"
;
      while(
$entry=$d->read()) {
       if (
$i<=1) {
       } else {
$ext explode(".",$entry);
$num count($ext)-1;
#Comprueba que se trata de un archivo
  
if (in_array($ext[$num], $extensione)) {
echo 
"
<tr>
<form action=\""
.$_SERVER['PHP_SELF']."\" method=\"post\">
<input type=\"hidden\" name=\"imagen\" value=\""
.$directorio.$entry."\">
<td><a href=\""
.$vista."?url=".$directorio.$entry."\">".$entry."</a></td>
<td>"
;
$filesize = (filesize($directorio.$entry)/1024);
$filesize number_format($filesize,2,",",".");
echo 
$filesize;
echo 
" kb's</td>
<td><input type=\"submit\" name=\"borrar\" value=\"Borrar\"></td>
</form>
</tr>
"
;
  } else {
#Listado de carpetas
echo "
<tr>
<form action=\""
.$_SERVER['PHP_SELF']."\" method=\"post\">
<input type=\"hidden\" name=\"imagen\" value=\""
.$url[1].$directorio.$entry."\">
<td bgcolor=\"#CCCCCC\"><a href=\""
.$_SERVER['PHP_SELF']."?dsub=".$directorio.$entry."\">".$entry."</a></td>
<td>"
;
#Tamaño de directorio
$filesize dirsize($directorio.$entry);
echo 
$filesize;
echo 
" kb's</td>
<td></td>
</form>
</tr>"
;
  }
       }
      
$i++;
      }
$d->close();
      echo 
"</table>";

//BORRADO DE CARPETAS/IMÁGENES
 
} elseif (isset($_POST['borrar']) AND isset($_POST['imagen'])) {
unlink($_POST['imagen']);
Header("Location: ".$_SERVER['PHP_SELF']."?id=5&borrado=".$_POST['imagen']);
exit();

//CREACION DE CARPETAS
 
} elseif (isset($_POST['carpeta'])) {
  if (isset(
$_POST['posicion'])) {
$directorio $_POST['posicion'];
  }
  if(! 
is_dir($directorio."/".$_POST['carpeta'])) {
mkdir($directorio."/".$_POST['carpeta'],0777);
Header("Location: ".$_SERVER['PHP_SELF']."?id=6&carpeta=".$_POST['carpeta']);
exit();
  } else {
Header("Location: ".$_SERVER['PHP_SELF']."?id=7&carpeta=".$_POST['carpeta']);
exit();
  }

//SUBIDA DE ARCHIVOS
 
} else {
$bytes 1024;
$tamano $tamano_kb*$bytes;
$num count($extension)-1;
#Mira la extension del archivo a subir
$extension explode(".",$_FILES['archivo_usuario']['name']);

#Comprueba extensiones
  
if (in_array($extension[$num], $extensione)) {
    if (
$_FILES['archivo_usuario']['size'] > $tamano) {
Header("Location: ".$_SERVER['PHP_SELF']."?id=3");
exit();
    } else {
  if (isset(
$_POST['posicion'])) {
$directorio $_POST['posicion']."/";
  }
   if  (
move_uploaded_file($_FILES['archivo_usuario']['tmp_name'], $directorio $_FILES['archivo_usuario']['name'])) {
  if (isset(
$_POST['posicion'])) {
#Redireccion a carpeta anterior
Header("Location: ".$_SERVER['PHP_SELF']."?id=1&dsub=".$_POST['posicion']);
exit();
  } else {
#Redireccion archivo subido correctamente
Header("Location: ".$_SERVER['PHP_SELF']."?id=1");
exit();
  }
   } else {
#Redireccion error al subir archivo
Header("Location: ".$_SERVER['PHP_SELF']."?id=2");
exit();
   }
    }
  } else {
#Redireccion tipo de archivo no valido
Header("Location: ".$_SERVER['PHP_SELF']."?id=4");
exit();
  }
 }

//FOOTER
echo "<br><br><font size=\"1\">Los ficheros ya existentes se sobreescribirán automáticamente<br>
Extensiones válidas: <b>"
.$extensiones."</b><br>
Tamaño máximo de fichero: <b>"
.$tamano_kb."</b>";

echo 
"<br><a href=\"".$_SERVER['PHP_SELF']."\">Pulsar en caso de error</a></font>";
echo 
footer_html(); //Ponemos el footer HTML
?>
Saludos
__________________
"No hay mujer fea sino copa de menos"

Última edición por El Menda; 09/10/2003 a las 16:22
  #2 (permalink)  
Antiguo 09/10/2003, 09:07
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
A simple vista .. tiene buena pinta.

Pero, ...

** Los elseif que tienes podrías haber usado switch() .. queda mas "claro" el código aunque cumple la misma funcionalidad.

** En algunos condicionales haces
if ($variable) ....

Debrías usar

if (isset($varible))

o empty() si corresponde (si deseas solo saber si está definida o si está definida y con valor distinto de NULL ..)

** Despues de todo header("location ...") deberías usar exit; para terminar el script .. pues si usas el "location" es para redireccionar y a su vez terminar la ejecución del script en curso.

** El ..
if($extension[$num] == $extensione[1] OR $extension[$num] == $extensione[2] OR $extension[$num] == $extensione[3] OR $extension[$num] == $extensione[4]) {

Puedes usar la función in_array() para ver si tu dato ($extension[$num] es un valor de tu array $extensiones .. Así no tendras que cambiar el código para nada si añades o quitas extensiones de ese array ..

** La extensión que obtienes haciendo:
$extension = explode(".",$_FILES['archivo_usuario']['name']);

Ya tiense una variable más del array $_FILES .. se llama "type" ($_FILES['archivo_usuario']['type']) y te dá el formato MIME del archivo (más seguro incluso que ver si el nombre contiene tu extensión .. pues de esta forma se asegura que realmente el archivo es de ese formato y no de otro "camuflado" ..) .. El formato MIME que te dará será algo tipo image/jpeg .. image/gif .. etc (medio/tipo) ..

** Tambien te hace falta mejorar la seguridad. Tienes que chequear siempre que el directorio que pretende borrar/subir .. hacer algo sea el de ese usuario y no otro .. Por ejemplo imagina que hago un ../../ .. podría "subirme" a directorios que no son mis asignados ...

Y al hilo de esta recomendación .. las variables que propagas en:
<input type=\"hidden\" name=\"imagen\" value=\"".$url[1].$directorio.$entry."\">

Podrias usar sesiones para aumentar la seguridad (propagando esas variables en la sesión) (e igualmente validar que la ruta indicada en esa variable esté dentro del directorio que tenga asignado el usuario ..


Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #3 (permalink)  
Antiguo 09/10/2003, 09:15
Avatar de El Menda  
Fecha de Ingreso: junio-2001
Ubicación: Jaén
Mensajes: 516
Antigüedad: 22 años, 10 meses
Puntos: 0
Jaja Cluster, me has dejado por los suelos.
Muchas gracias, de verdad.
Ahora cuando termine de estudiar haré lo que me has dicho.

Para los que lo quieran probar: copiar y pegar y nada más.
__________________
"No hay mujer fea sino copa de menos"
  #4 (permalink)  
Antiguo 09/10/2003, 10:34
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
mmm... bueno, no es sólo copiar y pegar (eso será en windows) ..

$directorio="archivote/"; //.. deberia usar rutas Absolutas para evitar problemas: tipo c:\tal\tal ..o /var/www/nose/tal según corresponda ..

Y avisar que ya que usas los array superglobales .. Tu script funciona en versiones de PHP 4.1.0 o superiroes e independiente (a no ser que se te escapara alguna variable por ahí ..) el estado de register_globals (de tu php.ini) a on o a OFF.

Y .. bueno, mas detalles que hay que avisar sobre el tema del "upload" .. Ese tema particular de configuración de PHP es muy sensible .. así que si en la "documentación" que hagas del script lo avisas .. mejor, menos problemas les dará a la gente que lo use o estarán avisados.

En principio .. de eso mismo adolecen la mayoría de scripts que se publican por aquí ..y por allá .. Son pocos los que informan al detalle de la configuración exacta del servidor (de PHP) para que funcione correctamente .. Por eso, por mis experiencias .. te aviso y si puedes informalo en tu documentación.

Cuando tengas la nueva versión .. avisas y si corresponde hasta se podría subir a las FAQ's del foro PHP.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #5 (permalink)  
Antiguo 09/10/2003, 12:14
Avatar de El Menda  
Fecha de Ingreso: junio-2001
Ubicación: Jaén
Mensajes: 516
Antigüedad: 22 años, 10 meses
Puntos: 0
Ya he corregido algunos fallos del script en mi primer mensaje.
Se me olvidó daros el script ver.php
Poned en $subir el nombre que le hallais puesto al script principal.
Código PHP:
<?
#Archivo subida
$subir="subir.php";

$url=$_GET['url'];
echo 
"<img src=\"".$url."\" alt=\"Imagen perteneciente a X\"> \n
<br><br>
<a href=\""
.$subir."\">Volver</a>
"
;
?>
__________________
"No hay mujer fea sino copa de menos"
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 20:06.