Esto es seguro.
Uno siempre puede contrabandear código ejecutable dentro de una imagen:
- Simplemente cargue su código PHP con otra extensión.
- Póngalo en metadatos, como EXIF.
- Use píxeles específicamente coloreados de modo que su representación binaria sea su código PHP deseado, que sobrevivirá a la recodificación (en realidad lo vi en la vida real, explotado usando: enlace ).
Por lo tanto, ya debe asumir que los contenidos de su archivo no son seguros cuando son suministrados por el usuario. Incluso si vuelve a codificar la imagen, e incluso si convierte formatos, es todavía una imagen, así que no la ejecute con sangre . Si su servidor web (como Apache o Nginx) lo ejecuta a través del intérprete de PHP, entonces alguien encontrará una manera de hacer que PHP haga algo desagradable. Al obligar a la extensión a ser una de las pocas extensiones incluidas en la lista blanca, puede decirle a su servidor web que es una imagen (no ejecutable) y que no debe pasar por el intérprete.
Hay, por supuesto, algunos riesgos relacionados a tener en cuenta:
- Su usuario podría poner bytes nulos u otras cosas divertidas en el nombre del archivo, lo que podría permitirles elegir su extensión después de todo.
- Su usuario podría tratar de usar el recorrido de la ruta si le permite elegir el nombre de archivo, lo que podría permitirle hacer todo tipo de cosas.
- Puede cometer un error en la configuración del servidor web y todo se ejecuta a través del intérprete, independientemente de la extensión (ya he visto esto antes: es un error silencioso, porque PHP genera literalmente todo lo que no reconoce, por lo que las imágenes se verá igual antes y después de la interpretación de PHP).
- El archivo puede contener un exploit para un decodificador específico, por ejemplo, si sabe que el administrador puede ver su imagen y usa un navegador que tiene un visor PNG vulnerable, puede cargar una imagen PNG que explote esa vulnerabilidad.
Los dos primeros se resuelven fácilmente: nunca permita que el usuario elija su nombre de archivo, o al menos incluya en la lista blanca un conjunto de caracteres que son definitivamente seguros, como ^[a-zA-Z0-9_-]*$
(alfanumérico, guión bajo y guión).
Se puede verificar el tercero colocando un archivo llamado "test.png" en algún lugar y colocando <?php echo "test1";
en él. Cuando solicite el archivo a través de curl, debería ver el código completo. Si solo ves "test1", entonces es vulnerable.
Finalmente, el último es difícil de verificar y está algo fuera de alcance. Puede usar un escáner de virus en el lado del servidor, pero los escáneres de virus solo detectan algunos casos comunes y, por lo general, no podrán detectar todas las variantes de una vulnerabilidad, si conocen la vulnerabilidad en primer lugar. El usuario debería, idealmente, actualizar su sistema y no ejecutar software vulnerable. Pero si se encuentra en un entorno de alta seguridad, debería aplicar la defensa en profundidad y hacer cosas como volver a codificar la imagen, tal vez solo permita que los usuarios vean las imágenes en una máquina virtual, etc. Pero eso está fuera del alcance de esta pregunta. .
Resumen: Hay algunos ataques relacionados que no se han demostrado para mitigar, pero cuando solo se considera el fragmento de código como publicado: esa parte es segura.