No hay concepción del tipo de archivo. En el mundo de la computación, todo es un grupo de 0/1 y si es una imagen o muchos caracteres aleatorios depende de cómo interpretes tus ceros y unos. El tipo de archivo (como una extensión como .docx, .png) es solo para la conveniencia del usuario, para poder hacer una conjetura informada de lo que puede ser y abrirlo con una herramienta adecuada. Como con cualquier conjetura, puede estar mal.
Entonces, en lugar de tratar de jugar con técnicas como la sugerida fileinfo , si fuera tú , Prefiero averiguar qué es lo que permito que las personas suban.
Entonces, si permite que las personas suban imágenes, utilice getimagesize y puede incluso verificar que la altura del ancho está en el rango apropiado (quién sabe puede ser que alguien suba una imagen de 500.000 píxeles de ancho / alto y su servidor morirá mientras la redimensiona. Es una imagen válida, pero aún no es lo que quiere). Puede tener sentido cambiar el tamaño de cada imagen y solo servir formatos redimensionados y almacenar originales intocables en algún lugar.
Si decide que los usuarios pueden cargar archivos .mp3, eche un vistazo a algo que puede tratar con estos tipo de archivos . Quien sabe puede estar allí, ya hay métodos probados para verificar si este es realmente un archivo mp3.
Con respecto a lo que decidas , usa algo para mitigar posibles problemas (suponiendo que la persona suba un archivo $file = $_FILES['file'])
:
- comprueba si hay errores durante la carga
if (!$file['name'] || $file['error']){ return false; }
- compruebe que este archivo realmente tiene el tamaño aceptado por usted
if ($file['size'] > MaxPossible || $file['size'] < MinPossible){ return false; }
- cambiar el nombre del archivo (si envío algo como
../../../t.py.png
, se cambiará el nombre a uniquefilename.png
)
- se guarda con los menos permisos posibles. Seguramente sin ningún permiso para ser ejecutado. (puede ser 640 o 660)
- para asegurarse de que no haya forma de realizar XSS, guárdelos y sirva desde un dominio separado.