PHP filter_input () non protegge da eval ()

2

Stavo aggiornando del codice PHP seguendo il consiglio di non usare più $_GET e $_POST ma invece di passare alle funzioni filter_input() più sicure.

Pensavo che quella funzione mi avrebbe salvato in questo stupido caso:

<?php 

eval($_GET["var"]);

?>

che quando chiamato come localhost/test.php?var=phpinfo(); sputa l'intera pagina di informazioni PHP. Quindi l'ho cambiato in:

<?php 

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

?>

Tuttavia sembra che quanto sopra sia ancora vulnerabile allo stesso attacco. Quale dovrebbe essere il modo corretto di proteggere eval() nel caso precedente?

    
posta sarah.ferguson 01.03.2016 - 16:39
fonte

2 risposte

5

filter_input è progettato per filtrare elementi che potrebbero causare problemi con l'output HTML: dal manuale PHP "Tag di strisce, opzionalmente striscia o codifica caratteri speciali."

phpinfo() non include caratteri speciali, o tag, quindi è passato esattamente come previsto, quindi eval lo esegue. In effetti, questo è il caso per un sacco di codice PHP - stai usando un filtro progettato per uno scopo diverso.

Come dice @SteffanUllrich, non puoi proteggere eval - esegue PHP, che è quasi esattamente ciò che vuoi impedire. L'opzione migliore a questo punto è riscrivere il codice per evitare di utilizzare la funzione eval .

I modi per farlo potrebbero includere il passaggio di un riferimento indiretto a una funzione (ad esempio se ottieni un parametro di 1 , usa un blocco switch per eseguire function_one() ), o semplicemente codifica ogni file PHP per fare un cosa specifica Se fornisci un modo per un utente finale di fornire codice PHP che viene eseguito, è probabile che tu abbia dei problemi.

    
risposta data 01.03.2016 - 16:52
fonte
7

Which should be the correct way of securing the eval() in the case above?

Non c'è modo di proteggere l'input da eval. Basta non usare eval su nessun dato generato dall'utente.

    
risposta data 01.03.2016 - 16:46
fonte

Leggi altre domande sui tag