Chiamando le funzioni stringa in modo sicuro

1

Desidero implementare alcune funzioni chiamabili dall'utente nel mio codice. Io uso qualcosa del genere:

function funcTest(){

    echo "This is test function";

}

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

}
else echo "ERROR";

Il codice è sicuro? Qualcuno può eseguire funzioni arbitrarie? Non ho trovato il modo, ma voglio essere sicuro perché è un progetto importante.

    
posta opc0de 21.12.2014 - 01:14
fonte

2 risposte

2

Con il tuo codice corrente, gli utenti possono chiamare qualsiasi funzione con zero parametri con inizia con func . Sebbene probabilmente non ci sia nessuno nel repertorio standard di PHP che possa costituire una minaccia quando viene chiamato, l'ambiente runtime in cui si desidera utilizzare questa funzione potrebbe avere tali funzioni. Potresti anche voler cambiare il prefisso o la composizione del nome della funzione reale in futuro, il che potrebbe cambiare radicalmente la situazione.

Il mio punto è che non si esegue alcuna convalida del nome della funzione. Dovresti avere un elenco di funzioni consentite da chiamare (cioè una whitelist) e chiamare function_exists per affermare che la funzione esiste effettivamente:

if (isset($_GET['cmd']))
{
    $func = "func".$_GET['cmd'];
    if (in_array($func, $allowedFunctions) && function_exists($func))
    {
        $func();
    }
}
    
risposta data 21.12.2014 - 09:06
fonte
2

Non si disinfetta l'input dell'utente, che di per sé è considerato una cattiva pratica. Sebbene io non pensi possa essere sfruttato, forse il codice seguente è considerato più sicuro.

    <?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;
      }
    ?>

Quando il parametro 'cmd' viene manomesso, lo script non farà nulla. Nel tuo caso, lo script proverà a caricare una funzione basata sulla variabile cmd.

Se la funzione non esiste, PHP genererà un errore e probabilmente rivelerà informazioni sul sistema come il percorso interno.

    
risposta data 21.12.2014 - 07:30
fonte

Leggi altre domande sui tag