Algunas consideraciones de seguridad cuando se suben archivos vía PHP

Php permite subir archivos vía HTTP de un modo bastante simple (Si tenés dudas consultá acá).

Un uso bastante común de esta funcionalidad es la de permitir al visitante ingresar imágenes, por ejemplo: su foto de perfil.

Existe una serie de consideraciones respecto de la seguridad a tener en cuenta cuando se realiza una tarea de este tipo.

Con estas medidas estamos intentando evitar que un atacante engañe a nuestro sistema subiendo código malicioso que podría, por ejemplo, darle acceso a información privilegiada.

Validar que el archivo recibido sea del tipo esperado

Lo primero de lo que querremos estar seguros es de que el archivo que acabamos de recibir sea efectivamente una imagen (GIF, JPG, etc…). La forma inocente de hacer esta verificación es a través del nombre del archivo (si las últimas tres letras son…).

La forma correcta de hacer esta verificación es a través del mime-type (Ver acá para más información).

No almacenarlos en un directorio accesible públicamente

En general, es conveniente que los archivos recibidos desde terceras partes (especialmente cuando se trata de visitantes), sean almacenados fuera del directorio raíz de nuestro proyecto.

Desde un script de nuestro proyecto siempre se puede abrir un archivo con algo como:

fopen(__DIR__.'/../uploads/foto.jpg');

Contar con un método propio para ver su contenido

Por último, es conveniente contar con algún método (puede ser un script especialmente diseñado para este efecto) que reciba como parámetro el nombre del archivo que se está solicitando y devuelva su contenido.

Por ejemplo:

showFile.php:

<?php

echo file_get_scontents($_GET['f']);

De este modo, si alguien lograra de algún modo subir código malicioso, al intentar ejecutarlo se encontraría con que en su navegador se vería su propio código (sin haber sido ejecutado nada).

mchojrin

Por mchojrin

Ayudo a desarrolladores PHP a acceder mercados y clientes más sofisticados y exigentes

3 comentarios

    1. Hola Maiko:

      ¿Cómo estás? Ante todo algunas aclaraciones: PDO es una librería orientada a objetos para el manejo de bases de datos relacionales. Si no estás del todo cómodo con POO te recomiendo este libro.

      Luego, no hay algo específico que haya que hacer para subir archivos PDF (Desde el punto de vista del servidor da igual el tipo de archivo que subas). Puedes ver más información sobre subir archivos aquí.

      Y ahora, siendo que usas PDO, imagino que tu pregunta va dirigida a cómo almacenar esos archivos en el servidor. Mi sugerencia es que guardes sólo la ruta en la BD y el archivo en el disco o en algún CDN.

      Puedes ver más info sobre esto aquí.

      Exitos!

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.