Llamar a las funciones de cadena de forma segura

1

Deseo implementar algunas funciones que se pueden llamar al usuario en mi código. Yo uso algo como esto:

function funcTest(){

    echo "This is test function";

}

if (isset($_GET['cmd']))
{
    $func = "func".$_GET['cmd'];
    $func();

}
else echo "ERROR";

¿Es seguro el código? ¿Puede alguien ejecutar funciones arbitrarias? No encontré el camino, pero quiero estar seguro ya que es un proyecto importante.

    
pregunta opc0de 21.12.2014 - 01:14
fuente

2 respuestas

2

Con su código actual, los usuarios pueden llamar a cualquier función con cero parámetros con inicios con func . Aunque probablemente no haya ninguno en el repertorio estándar de PHP que pueda suponer una amenaza al ser llamado, el entorno de ejecución en el que desea utilizar esto puede tener tales funciones. Es posible que también desee cambiar el prefijo o la composición del nombre de la función en el futuro, lo que puede cambiar la situación radicalmente.

Mi punto es que no hace ninguna validación del nombre de la función. Debe tener una lista de funciones permitidas para ser llamadas (es decir, una lista blanca) y llamar a function_exists para afirmar que la función existe realmente:

if (isset($_GET['cmd']))
{
    $func = "func".$_GET['cmd'];
    if (in_array($func, $allowedFunctions) && function_exists($func))
    {
        $func();
    }
}
    
respondido por el Gumbo 21.12.2014 - 09:06
fuente
2

Usted no desinfecta su entrada de usuario, eso por sí solo se considera una mala práctica. Aunque no pienso puede explotarse, tal vez el siguiente código se considere más seguro.

    <?php

      function x()
      {
         // what ever this function should do
      }

      function y()
      {
         // what ever this function should do
      }

      function z()
      {
         // what ever this function should do
      }

      $func = yourInputFilerFunction($_GET['cmd']);

      switch ($func) {
        case "x":
            x();
            break;
        case "y":
            y();
            break;
        case "z":
            z();
            break;
      }
    ?>

Cuando se manipula el parámetro 'cmd', el script no hará nada. En su caso, el script intentará cargar una función basada en la variable cmd.

Si la función no existe, PHP generará un error y posiblemente revelará información sobre el sistema, como la ruta interna.

    
respondido por el Jeroen - IT Nerdbox 21.12.2014 - 07:30
fuente

Lea otras preguntas en las etiquetas