Al asegurar la carga de imágenes, hay básicamente tres enfoques que conozco (por supuesto, idealmente, se usan los tres):
- comprobar la extensión del archivo
- almacenar archivos cargados en un directorio no ejecutable fuera de webroot
- verifique el contenido / tipo mime del archivo
Para el tercer punto, hay varias funciones de PHP que se sugieren, la mayoría de las cuales pueden ser omitido al codificar el código en fragmentos de IDAT . Aquí están los resultados que obtengo:
<?php $image = 'imageshell.png';
echo exif_imagetype($image);
// -> 3 (IMAGETYPE_PNG)
echo "<br>" . getimagesize($image)[2];
// -> 3 (IMAGETYPE_PNG)
echo "<br>" . mime_content_type($image);
// -> image/png
echo "<br>" . finfo_file(finfo_open(FILEINFO_MIME_TYPE), $image);
// -> image/png
echo "<br>" . finfo_file(finfo_open(FILEINFO_MIME_TYPE, "/usr/share/misc/magic"), $image);
// -> application/octet-stream
Básicamente tengo estas preguntas ahora:
- ¿Por qué el resultado es diferente si paso un archivo mágico (no debería seguir aceptando el archivo como un archivo de imagen, ya que eso es lo que realmente es?), qué es exactamente un archivo mágico, y qué hace PHP incorporado. aspecto de archivo mágico?
- ¿Puedo verificar de antemano si el sistema tiene un archivo mágico que resulte en la identificación correcta de una no-imagen o una imagen que contenga código PHP?
- Si no puedo, ¿hay un mejor enfoque para verificar si un archivo de imagen contiene código PHP?
- ¿También es posible omitir la última comprobación, la que resulta en
application/octet-stream
, también?