PHP filter_input () no protege de eval ()

2

Estaba actualizando algunos códigos PHP siguiendo el consejo de no usar más $_GET y $_POST , sino que, en cambio, cambiar a las funciones filter_input() más seguras.

Estaba pensando que la función me salvaría en este estúpido caso:

<?php 

eval($_GET["var"]);

?>

que cuando se llama como localhost/test.php?var=phpinfo(); escupe toda la página de información de PHP. Así que lo cambié a:

<?php 

eval(filter_input(INPUT_GET, "var", FILTER_SANITIZE_STRING));

?>

Sin embargo, parece que lo anterior sigue siendo vulnerable al mismo ataque. ¿Cuál debería ser la forma correcta de asegurar el eval() en el caso anterior?

    
pregunta sarah.ferguson 01.03.2016 - 16:39
fuente

2 respuestas

5

filter_input está diseñado para filtrar cosas que pueden causar problemas con la salida HTML: desde el manual de PHP "Eliminar etiquetas, opcionalmente eliminar o codificar caracteres especiales".

phpinfo() no incluye ningún carácter especial, o etiquetas, por lo que se pasa exactamente como se proporciona, luego eval lo ejecuta. De hecho, este es el caso de una gran cantidad de código PHP: estás usando un filtro diseñado para un propósito diferente.

Como dice @SteffanUllrich, no puede asegurar eval ; ejecuta PHP, que es casi exactamente lo que quiere evitar. Su mejor opción en este momento es volver a escribir su código para evitar el uso de la función eval .

Las formas de hacer esto podrían incluir pasar una referencia indirecta a una función (por ejemplo, si obtiene un parámetro de 1 , use un bloque switch para ejecutar function_one() ), o simplemente codifique cada archivo PHP para hacer una cosa especifica Si proporciona alguna forma para que un usuario final proporcione el código PHP que se ejecuta, es probable que tenga problemas.

    
respondido por el Matthew 01.03.2016 - 16:52
fuente
7
  

¿Cuál debería ser la forma correcta de asegurar la eval () en el caso anterior?

No hay manera de asegurar la entrada a eval. Simplemente no use eval en ningún dato generado por el usuario.

    
respondido por el Steffen Ullrich 01.03.2016 - 16:46
fuente

Lea otras preguntas en las etiquetas