¿Es seguro usar un script PHP para cargar un PNG codificado en Base64?

3

Como parte de un proyecto más grande en el que estoy trabajando, necesito escribir un script PHP para convertir una cadena Base64 en una imagen. La forma en que me gustaría pasar la cadena Base64 a la secuencia de comandos a través de una consulta GET, así que ...

example.com/base64ToPng.php?base64=thisIsTheBase64ForTheImage

Luego me gustaría convertir el Base64 que se pasa a una imagen PNG y mostrarlo como si el propio archivo PHP fuera una imagen. Si bien este no es un problema desde el punto de vista del desarrollo, me preocupa la seguridad de hacerlo. ¿Me pondría en peligro porque el usuario creará la Base64? (O más precisamente, la Base64 será creada por un programa basado en la imagen que el usuario le proporcionó). Me preocupa especialmente que el usuario cree una imagen maliciosa que pueda ejecutar código arbitrario, pero no sé si esto es así. una preocupación válida dado que la imagen solo será recreada por el script PHP pero no almacenada en el servidor.

<?php       
    if(!isset($_GET['x'])) {
        die();
    }

    $image = base64_decode($_GET['x']);
    header ('Content-type: image/png');
    imagepng($image, NULL, 0);
?>
    
pregunta DavidB 17.03.2017 - 18:28
fuente

2 respuestas

3

No es seguro usar URL con más de 2000 caracteres. Si bien la URL RFC no especifica ningún límite en particular, la mayoría los navegadores limitan la cantidad de caracteres en una URL a menos de 2000 caracteres .

Otro problema es que usar base64 es muy ineficiente para el espacio, ya que estarás codificando tres bytes con cuatro bytes. Esto significa que el tamaño máximo de la imagen que prácticamente puede adjuntar de manera confiable o la mayoría de los navegadores es inferior a 1,5 KB.

También debe considerar que la ejecución de este servicio hará que los archivos de registro de su servidor web se llenen muy rápidamente, ya que registrará todas las URL. Puede ser posible truncar / hash la URL registrada, pero eso dificultará la resolución de problemas.

Apéndice:

A menos que desee editar realmente los datos de la imagen, su implementación solo puede hacer eco de los datos de la imagen, sin necesidad de imagepng ():

<?php
if(!isset($_GET['x'])) {
    die();
}
$image = base64_decode($_GET['x']);
header ('Content-type: image/png');
echo $image;
?>
    
respondido por el Lie Ryan 19.03.2017 - 09:02
fuente
0
  

Dicho esto, ¿todavía debo preocuparme por las vulnerabilidades de ejecución del código si utilizo el método que sugirió aquí?

No, no lo haces. base64_decode todavía devuelve una cadena, que no puede ejecutarse en el punto de decodificación. De esta manera, que solo repitas la cadena, no ejecutará ningún PHP.

En el lado del cliente: Sin embargo, la inyección de JavaScript podría activarse, pero al establecer el encabezado image/png , esto ya se ha evitado.

    
respondido por el Rápli András 19.03.2017 - 22:08
fuente

Lea otras preguntas en las etiquetas