Saltar al contenido

Subir DOC o PDF usando PHP

Te sugerimos que revises esta solución en un entorno controlado antes de pasarlo a producción, un saludo.

Solución:

no use el ['type'] parámetro para validar cargas. Ese campo lo proporciona el usuario y se puede falsificar de manera trivial, lo que permite cargar CUALQUIER tipo de archivo. Lo mismo ocurre con el ['name'] parámetro: ese es el nombre del archivo proporcionado por el usuario. También es trivial de falsificar, por lo que el envío del usuario nastyvirus.exe y llamándolo cutekittens.jpg.

El método adecuado para validar las cargas es usar la determinación del tipo MIME del lado del servidor, por ejemplo, a través de fileinfo, además de tener una verificación adecuada del éxito de la carga, lo cual no hace:

if ($_FILES['file']['error'] !== UPLOAD_ERR_OK) 
    die("Upload failed with error " . $_FILES['file']['error']);

$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime = finfo_file($finfo, $_FILES['file']['tmp_name']);
$ok = false;
switch ($mime) 
   case 'image/jpeg':
   case 'application/pdf'
   case etc....
        $ok = true;
   default:
       die("Unknown/not permitted file type");

move_uploaded_file(...);

También está utilizando el nombre de archivo proporcionado por el usuario como parte del destino final de move_uploaded_files. también es trivial incrustar datos de ruta en ese nombre de archivo, que luego usa a ciegas. Eso significa que un usuario remoto malicioso puede garabatear en CUALQUIER archivo en su servidor para el que conoce la ruta, además de plantar nuevos archivos.

Agregue los tipos mime correctos a su código, al menos estos:

.jpeg -> image/jpeg
.gif  -> image/gif
.png  -> image/png

Puede encontrar una lista de tipos de mimos aquí.

Además, simplifique la lógica del código e informe un número de error para ayudar al soporte de primer nivel a localizar los problemas:

$allowedExts = array(
  "pdf", 
  "doc", 
  "docx"
); 

$allowedMimeTypes = array( 
  'application/msword',
  'text/pdf',
  'image/gif',
  'image/jpeg',
  'image/png'
);

$extension = end(explode(".", $_FILES["file"]["name"]));

if ( 20000 < $_FILES["file"]["size"]  ) 
  die( 'Please provide a smaller file [E/1].' );


if ( ! ( in_array($extension, $allowedExts ) ) ) 
  die('Please provide another file type [E/2].');


if ( in_array( $_FILES["file"]["type"], $allowedMimeTypes ) ) 
      
 move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]); 

else

die('Please provide another file type [E/3].');

$folder = "Resume/";
$temp = explode(".", $_FILES["uploaded"]["name"]);
$newfilename = round(microtime(true)).'.'. end($temp);
$db_path ="$folder".$newfilename  ;
//remove the .
$listtype = array(
'.doc'=>'application/msword',
'.docx'=>'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
'.rtf'=>'application/rtf',
'.pdf'=>'application/pdf'); 
if ( is_uploaded_file( $_FILES['uploaded']['tmp_name'] ) )
{
if($key = array_search($_FILES['uploaded']['type'],$listtype))
if (move_uploaded_file($_FILES['uploaded']  ['tmp_name'],"$folder".$newfilename))

include('connection.php');
$sql ="INSERT INTO tb_upload
(filePath) VALUES ('$db_path')";


else    

echo "File Type Should Be .Docx or .Pdf or .Rtf Or .Doc";

Si te gustó nuestro trabajo, tienes la libertad de dejar un enunciado acerca de qué le añadirías a esta crónica.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *