Foros del Web » Programando para Internet » PHP »

Subir archivo al servidor

Estas en el tema de Subir archivo al servidor en el foro de PHP en Foros del Web. Hola a todos, estoy utilizando un formulario en el que utilizo un "input file" para que se puedan subir imagenes al servido, ademas toda la ...
  #1 (permalink)  
Antiguo 04/08/2009, 11:08
thi
 
Fecha de Ingreso: abril-2009
Mensajes: 244
Antigüedad: 15 años
Puntos: 0
Subir archivo al servidor

Hola a todos,

estoy utilizando un formulario en el que utilizo un "input file" para que se puedan subir imagenes al servido, ademas toda la información que se escribe en el formulario la guardo en una base de datos, para esto utilizo un archivo php que me guarda toda la información en la base de datos.

El problema es que el archivo de la imagen no me lo sube al servidor. Estoy utilizando el siguiente codigo(el cual me ha funcionado en otras partes de la web)

//subir imagen
$nombre = $_FILES[$_POST['img']]['name'];
$tipo_archivo = $_FILES[$_POST['img']]['type'];
$tamano_archivo = $_FILES[$_POST['img]]['size'];
$ruta = "/images/ofertas/" ;
$ruta_del_archivo = $ruta.$_FILES[$_POST['img']];

if ($nombre!='') //aqui valido el tipo de archivo
{
if (!((strpos($tipo_archivo, "gif") || strpos($tipo_archivo, "jpeg") || strpos($tipo_archivo, "jpg") || strpos($tipo_archivo, "png") ) && ($tamano_archivo < 1000000)))
{
echo "La extensión o el tamaño de los archivos no es correcta. <br><br><table><tr><td><li>Se permiten archivos .gif, .jpg o .png<br><li>se permiten archivos de 1 MEGA máximo.</td></tr></table>";
exit(0);
}
else
{
if (move_uploaded_file($_FILES[$_POST['img']]['tmp_name'],$ruta_del_archivo))
{
//echo "La imagen ha sido cargada correctamente.";
echo "<script language='javascript'>alert('La imagen ha sido cargada correctamente.')</script>";
//echo $ruta_del_archivo;
}
else
{
//echo "Ocurrio un error por favor intentelo luego.";
echo "<script language='javascript'>alert(Ocurrio un error por favor intentelo luego.')</script>";
}
}
}
//*************************************

este codigo lo utilizo en otras partes de la web y funciona, pero siempre, dentro del mismo archivo, sin utilizar un archivo php.

Un saludo.
  #2 (permalink)  
Antiguo 04/08/2009, 11:15
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Subir archivo al servidor

de verdad te sirve??

yo no lo creo.... ya que tiene bastantes errores e incongruencias!!


¿porque usas $_POST['img'] como el índice del upload??
Cita:
$_FILES[$_POST['img']]['name'];
según el manual, debes usar el name="algo" de tu <input/>


ahora, ¿porque usas el array completo como nombre de ruta??
Cita:
$ruta_del_archivo = $ruta.$_FILES[$_POST['img']];
ya que $_FILES['name_del_input'] siempre devuelve un array()


¿¿de verdad eres honesto con lo que argumentas??

(ya quisiera ver funcionando este código, blah!!)
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 04/08/2009, 11:28
thi
 
Fecha de Ingreso: abril-2009
Mensajes: 244
Antigüedad: 15 años
Puntos: 0
Respuesta: Subir archivo al servidor

Si que me funciona, pero como dije en local y claro tiene ligeras modificaciones. El codigo que me funciona es el siguiente:

$nombre = $_FILES['img']['name'];
$tipo_archivo = $_FILES['img']['type'];
$tamano_archivo = $_FILES['img']['size'];
$ruta = "images/ofertas/" ;

$ruta_del_archivo = $ruta.$_FILES['img']['name'];

if ($nombre!='') //aqui valido el tipo de archivo
{
if (!((strpos($tipo_archivo, "gif") || strpos($tipo_archivo, "jpeg") || strpos($tipo_archivo, "jpg") || strpos($tipo_archivo, "png") ) && ($tamano_archivo < 1000000)))
{
echo "La extensión o el tamaño de los archivos no es correcta. <br><br><table><tr><td><li>Se permiten archivos .gif, .jpg o .png<br><li>se permiten archivos de 1 MEGA máximo.</td></tr></table>";
exit(0);
}
else
{
if (move_uploaded_file($_FILES['img']['tmp_name'],$ruta_del_archivo))
{
echo "La imagen ha sido cargada correctamente.";
}
else
{
echo "Ocurrio un error por favor intentelo luego.";
}
}
}

El otro es el que estaba intentando que funcionara.
  #4 (permalink)  
Antiguo 04/08/2009, 11:31
Avatar de gjx2  
Fecha de Ingreso: agosto-2008
Ubicación: R.D
Mensajes: 1.153
Antigüedad: 15 años, 8 meses
Puntos: 139
Respuesta: Subir archivo al servidor

Pero si el ultimo te funciona perfectamente, por que quieres daniarlo?
  #5 (permalink)  
Antiguo 04/08/2009, 12:49
thi
 
Fecha de Ingreso: abril-2009
Mensajes: 244
Antigüedad: 15 años
Puntos: 0
Respuesta: Subir archivo al servidor

No lo quiero cambiar sino que en esta otra ventana no me funciona en local porque el input llama a un archivo php y no me manda la información en local, por este motivo estoy intentando adaptarlo para que funcione mandando la información a un archivo php.

Un saludo.
  #6 (permalink)  
Antiguo 04/08/2009, 13:06
Avatar de gjx2  
Fecha de Ingreso: agosto-2008
Ubicación: R.D
Mensajes: 1.153
Antigüedad: 15 años, 8 meses
Puntos: 139
Respuesta: Subir archivo al servidor

Vamos a ver
Intentalo de esta manera.
Copia todo el codigo y pegalo en un mismo archivo.
Y pruebalo.

Código HTML:
Ver original
  1. <form name="form" action="<?=$_SERVER['PHP_SELF']?>" method="post" enctype="multipart/form-data">
  2. <input type="file" name="img">
  3. <input type="submit" name="btn" value="enviar">
  4. </form>
  5. <?php

Código PHP:
Ver original
  1. if(isset($_POST['btn'])){
  2. $nombre = $_FILES['img']['name'];
  3. $tipo_archivo = $_FILES['img']['type'];
  4. $tamano_archivo = $_FILES['img']['size'];
  5.  
  6. if(!is_dir("images/")){
  7.     mkdir("images");
  8.     mkdir("images/ofertas");
  9. }
  10.  
  11. $ruta = "images/ofertas/" ;
  12.  
  13. $ruta_del_archivo = $ruta.$_FILES['img']['name'];
  14.  
  15. if ($nombre!='') //aqui valido el tipo de archivo
  16. {
  17. if (!((strpos($tipo_archivo, "gif") || strpos($tipo_archivo, "jpeg") || strpos($tipo_archivo, "jpg") || strpos($tipo_archivo, "png") ) && ($tamano_archivo < 1000000)))
  18. {
  19. echo "La extensión o el tamaño de los archivos no es correcta. <br><br><table><tr><td><li>Se permiten archivos .gif, .jpg o .png<br><li>se permiten archivos de 1 MEGA máximo.</td></tr></table>";
  20. exit(0);
  21. }
  22. else
  23. {
  24. if (move_uploaded_file($_FILES['img']['tmp_name'],$ruta_del_archivo))
  25. {
  26. echo "La imagen ha sido cargada correctamente.";
  27. }
  28. else
  29. {
  30. echo "Ocurrio un error por favor intentelo luego.";
  31. }
  32. }
  33. }
  34. }
  35. ?>
  #7 (permalink)  
Antiguo 04/08/2009, 13:21
thi
 
Fecha de Ingreso: abril-2009
Mensajes: 244
Antigüedad: 15 años
Puntos: 0
Respuesta: Subir archivo al servidor

Perdonad, es que me debo explicar mal.

- Cuando todo el codigo esta en un mismo archivo, me funciona correctamente.

- Cuando pongo el codigo para guardar la imagen en otro archivo es cuando no funciona. Os pongo el codigo del FORM:

print"<FORM name='form1' action='/sub_oferta.php?nom_tour=".$my->username."' METHOD=\"POST\" target='_blank' enctype='multipart/form-data' >";

como veis estoy llamando al archivo "sub_oferta.php" en este archivo es donde pongo todo el codigo para guardar toda la información de la imagen en una base de datos junto con el nombre de la imagen.

Por culpa del FORM, el codigo para guardar la imagen en el servidor no funciona estando en el mismo archivo.

Tambien es cierto que a lo mejor cambiando el boton, puede funcionar todo el codigo en el mismo archivo. El codigo del boton es:

print "<th colspan='2'><div align='center'><input type='submit' name='botonsubir' id='botonsubir' value='Subir Oferta' target='_blank' ></div></th>";

Un saludo.
  #8 (permalink)  
Antiguo 04/08/2009, 13:27
Avatar de gjx2  
Fecha de Ingreso: agosto-2008
Ubicación: R.D
Mensajes: 1.153
Antigüedad: 15 años, 8 meses
Puntos: 139
Respuesta: Subir archivo al servidor

No pero no puedes hacer esto
/sub_oferta.php?nom_tour=".$my->username.
tienes un problema en el action del formulario.

Si tu quieres enviar el nom_tour
deveras crear un input oculto para tal fin.


Debes de agregarle esto al formulario

Código PHP:
Ver original
  1. echo "<input type=\"hidden\" name=\"nom_tour\" value=\"$my->username\">";

Y deja el action del formulario solo con esta parte
Action="/sub_oferta.php"

Recuerda
En el ejemplo que te puse anteriormete el nombre del boton que hace submit tiene que llamarse
btn

de lo contrario tendrias que editar el codigo php en esta linea
Código PHP:
Ver original
  1. if(isset($_POST["btn"])){
  2. .....
  3. }
  #9 (permalink)  
Antiguo 04/08/2009, 13:56
 
Fecha de Ingreso: julio-2009
Mensajes: 118
Antigüedad: 14 años, 9 meses
Puntos: 2
Respuesta: Subir archivo al servidor

el upload es vulnerable ya que no mira la extensión y te podrían subir cualquier archivo .php

mírate esto: http://enphp.com/manuales%20php/ver/...os-con-php/15/
  #10 (permalink)  
Antiguo 04/08/2009, 14:05
Avatar de gjx2  
Fecha de Ingreso: agosto-2008
Ubicación: R.D
Mensajes: 1.153
Antigüedad: 15 años, 8 meses
Puntos: 139
Respuesta: Subir archivo al servidor

Cita:
Iniciado por albert1980 Ver Mensaje
el upload es vulnerable ya que no mira la extensión y te podrían subir cualquier archivo .php

mírate esto: http://enphp.com/manuales%20php/ver/...os-con-php/15/
Gracias por la recomendaciones.
Si te detienes a ver el codigo te daras cuenta de que solo sube archivos con extensiones.
jpg,png,gif
  #11 (permalink)  
Antiguo 04/08/2009, 14:09
 
Fecha de Ingreso: julio-2009
Mensajes: 118
Antigüedad: 14 años, 9 meses
Puntos: 2
Respuesta: Subir archivo al servidor

Cita:
Iniciado por gjx2 Ver Mensaje
Gracias por la recomendaciones.
Si te detienes a ver el codigo te daras cuenta de que solo sube archivos con extensiones.
jpg,png,gif


Código PHP:
Ver original
  1. if (!((strpos($tipo_archivo, "gif") || strpos($tipo_archivo, "jpeg") || strpos($tipo_archivo, "jpg") || strpos($tipo_archivo, "png") ) && ($tamano_archivo < 1000000)))
  2. {


no revisa la extensión, únicamente revisa el mime type, que es muy fácil de manipular desde el lado del cliente ;)

Podríamos llegar a enviar una petición que causara este array:


$_FILES['img']['name'] = 'juak.php';
$_FILES['img']['type'] = 'image/jpeg';
$_FILES['img']['size'] = '23564';
  #12 (permalink)  
Antiguo 04/08/2009, 14:16
Avatar de gjx2  
Fecha de Ingreso: agosto-2008
Ubicación: R.D
Mensajes: 1.153
Antigüedad: 15 años, 8 meses
Puntos: 139
Respuesta: Subir archivo al servidor

Bueno me disculpa soy novato en con la progamacion de php , pero como puedes hacer un archivo php con el typo de mime image/jpeg

Pon un ejemplo para yo hacerlo aqui.
  #13 (permalink)  
Antiguo 04/08/2009, 14:28
 
Fecha de Ingreso: julio-2009
Mensajes: 118
Antigüedad: 14 años, 9 meses
Puntos: 2
Respuesta: Subir archivo al servidor

modificando los headers del navegador, por ejemplo con la extensión para firefox Live HTTP headers.


El $_FILES['img']['type'] PHP simplemente se encarga de extraerlo de los headers entonces lo que hacen para "hackear" el sistema y subir un archivo php normalmente malicioso es ponerle de type image/jpeg y de nombre imagen.php.

Un ejemplo (fijate en lo subrayado en rojo ;)):



  #14 (permalink)  
Antiguo 04/08/2009, 14:36
Avatar de gjx2  
Fecha de Ingreso: agosto-2008
Ubicación: R.D
Mensajes: 1.153
Antigüedad: 15 años, 8 meses
Puntos: 139
Respuesta: Subir archivo al servidor

Es que no entiendo
Por que yo le cambio los header al php



Código PHP:
Ver original
  1. <?php
  2. header ("Content-type: image/jpeg");
  3. ?>
y lo intento subir y no lo reconoce como imagen , lo sigue rechasando por que sabe que no es una imagen.

Ahora mi pregunta , como puedo enganar el codigo , subir una imagen " " y que resulte ser un .php ?
  #15 (permalink)  
Antiguo 04/08/2009, 14:41
 
Fecha de Ingreso: julio-2009
Mensajes: 118
Antigüedad: 14 años, 9 meses
Puntos: 2
Respuesta: Subir archivo al servidor

Los headers no se cambian con PHP, se cambian al enviarlos (en mi caso con la extensión que he nombrado).


Mira la imagen que ahi viene todo xD
  #16 (permalink)  
Antiguo 04/08/2009, 15:06
Avatar de gjx2  
Fecha de Ingreso: agosto-2008
Ubicación: R.D
Mensajes: 1.153
Antigüedad: 15 años, 8 meses
Puntos: 139
Respuesta: Subir archivo al servidor

No consegi guardar el dischoso .php usando tu explicacion
pero ni modo Gracias de todas formas.

Última edición por gjx2; 04/08/2009 a las 15:19
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 03:12.