Kernel Error
PHP

Upload Form en PHP

29 de Junio del 2009 por b@cHo · 2 Comentarios 

En esta entrada se explicará como hacer un form (ya que estamos en este tema desde hace ya algunas entradas), con ayuda de PHP para subir un archivo al servidor, poner un codigo CAPTCHA para seguridad, establecer tamaño maximo del archivo y extenciones permitidas:

Upload

En esta entrada, usaremos conocimientos adquiridos de entradas anteriores, que listare aqui:

Ahora bien, lo primero es entender como funciona el upload en PHP.

diagrama

Ahora bien lo necesario por partes.

El fomrulario en HTML

El motor en PHP

Imagen CAPTCHA en PHP

Directorio con permisos  leer-escribir (777)

Ahora el codigo

El formulario (formulario.html)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Subir</title>
</head>

<body>
<form action="motor.php" method="post" enctype="multipart/form-data">
  <p>Extensiones admitidas: .jpg ,.gif , bmp, .png
  <p>Tama&ntilde;o Maximo: 0.5mb

  <p>
     <label for="archivo">Selecciona un Archivo:</label>
     <input type="file" name="userfile" id="archivo">
     <br />
     <img src="captcha.php" alt="" />
   <p>Introduce el C&oacute;digo
     <input name="introducido" type="text" />
     <br />
     <input name="Enviar" type="submit" value="Enviar" />
   <p>
</form>
</body>

El motor (motor.php)

 session_start();
if (isset($_POST['Enviar'])) {

if( $_SESSION['CAPTCHA'] != $_POST['introducido'])
{
exit('Codigo Captcha Erroneo');
}
   // Configuracion
      $ext_admitidas = array('.jpg','.gif','.bmp','.png'); // Extensiones permitidas.
      $peso_max = 524288; // Tamaño maximo en  BYTES (eso equivale a 0.5MB).
      $subir_a = './archivo/'; // directorio a subir .

   $filename = $_FILES['userfile']['name']; // Obtiene el nombre del archivo, y su extension.
   $ext = substr($filename, strpos($filename,'.'), strlen($filename)-1); // Saca su extension.

   // Verifica si la extension es valida.
   if(!in_array($ext,$ext_admitidas))
      die('Formato invalido.');

   // Verifica el tamaño maximo.
   if(filesize($_FILES['userfile']['tmp_name']) > $peso_max)
      die('Archivo muy grande.');

   // Verifica permisos.
   if(!is_writable($subir_a))
      die('Permisos insuficientes .');

   // Mueve el archivo a su lugar correpondiente.
   if(move_uploaded_file($_FILES['userfile']['tmp_name'],$subir_a . $filename))
         echo 'Listo! <a href="' . $subir_a . $filename . '" title="Descarga">Tu archivo</a>'; // It worked.
      else
         echo 'Error.'; // error xD .
}

else {
echo "No accedas directamente a esta pagina.";
}</code>
<p style="text-align: left;"></p>
<p style="text-align: left;">El captcha (captcha.php)</p>
<code lang="php"> session_start();

$string = substr(md5(microtime() * mktime()),0,3);
$captcha = imagecreatefrompng("fondo.png");
$color = imagecolorallocate($captcha, 0, 0, 63);
$linea = imagecolorallocate($captcha,63,63,63);
imageline($captcha,0,0,39,29,$linea);
imageline($captcha,55,0,0,29,$linea);
imageline($captcha,40,0,64,29,$linea);
imagestring($captcha, 5, 10, 5, $string, $color);
$_SESSION['CAPTCHA'] = $string;
header("Content-type: image/png");
imagepng($captcha);

Como pueden ver, todo esta comentado en el motor para su sencilla comprensión, cualquier duda en la sección de comentario tengan en cuenta que el codigo es de fines educativos solamente, para educar sobre conceptos y metodos de implementacion
Finalmente, dejo un ejemplo y la versión para descargar.

Compartelo:
  • Digg
  • del.icio.us
  • Facebook
  • Mixx
  • Google Bookmarks
  • BarraPunto
  • Meneame
  • MySpace

Comentarios

2 Respuestas to “Upload Form en PHP”
  1. wariodiaz wariodiaz dice:

    Saludos, ps una observacion en tu codigo, no es 100% seguro, tienes un pequeño fallito, = si lo puedes contemplar, las validaciones de tipo de archivos no se deverian de hacer por extencion, eso es una validacion devil, ya que el usuario puede modificar el nombre de su archivo incluyendo su extencion, eso hace que sea posbile subir un archivo .php en lungar de un .jpg, solo abria que renmobrar foto.php por foto.jpg y listo tu validacion ya no funciona :S. y si el usuario tiene control sobre esos archivos despues de.. y puede renombrar nuevamente a .php olvidate de lo que puede hacer un usuario con el acceso a un php en tu sevidor.. con un vastaria para tener un ueco enorme en el servidor :S, para validar los tipos de archivo te recomiendo verificar con los tipos MIME, y el campo $_FILES['fichero'][type], el explorador te envia el tipo mime del archivo, es un poco tedioso por que no siempre todos los exploradores mandan el mimo MIME por lo que hay que estar checando que mime nos envia el explorador y validar por este, el mime tambien lo podria modificar teniendo la malevola intencion pero por lo menos no es tan facil como cambiar una extencion

    aparte, es vastante incomodo dejar un comentario en tu blog, imaginate si no tubieren ninguna de esas redes una cuenta, ya me hisistes entrar a una cuenta, si no quieres spam mejor pon una imagen de valoracion, esto la verdad es incomodo.
    Pakos
    <a href="http://w00t.in/jpqwj" rel="nofollow">http://w00t.in/jpqwj</a>

    Usando Firefox 3.5.3 Firefox 3.5.3 en Windows XP Windows XP
    • b@cHo b@cHo dice:

      Cito la ultima parte del tutorial,
      <blackqoute>Como pueden ver, todo esta comentado en el motor para su sencilla comprensión, cualquier duda en la sección de comentario tengan en cuenta que el codigo es de fines educativos solamente, para educar sobre conceptos y metodos de implementacion</blackqoute>

      El servicio de proveedores de 3eros no es solo para evitar spam, aparte todos los usuarios de internet en estos tiempos y es sencillamente para evitar la carga en el
      servidor.

      saludos y gracias por la sugerencia
      pd: no existen los codigos 100% seguros

      Usando Google Chrome 4.0.221.6 Google Chrome 4.0.221.6 en Windows XP Windows XP

Comenta algo

Comparte tu opinión...
Ah si... también si quieres mostrar una imagen tuya puedes usar gravatar!





BBCode Sencillo soportado.  

    Edición Avanzada desactivada.

Kernel Error
97 intentos de ataques detenidos