2009-10-22 17 views
11

Sto cercando di trovare un modo per pulire efficacemente tutte le variabili POST e GET con una singola funzione. Ecco la funzione stessa:

//clean the user's input 
function cleanInput($value, $link = '') 
{ 
    //if the variable is an array, recurse into it 
    if(is_array($value)) 
    { 
     //for each element in the array... 
     foreach($value as $key => $val) 
     { 
      //...clean the content of each variable in the array 
      $value[$key] = cleanInput($val); 
     } 

     //return clean array 
     return $value; 
    } 
    else 
    { 
     return mysql_real_escape_string(strip_tags(trim($value)), $link); 
    } 
} 

Ed ecco il codice che chiamano:

//This stops SQL Injection in POST vars 
foreach ($_POST as $key => $value) 
{ 
    $_POST[$key] = cleanInput($value, $link); 
} 

//This stops SQL Injection in GET vars 
foreach ($_GET as $key => $value) 
{ 
    $_GET[$key] = cleanInput($value, $link); 
} 

A me questo sembra come dovrebbe funzionare. Ma per qualche motivo non restituirà gli array da alcune checkbox che ho in una forma. Continuano a uscire in bianco.

Ho testato il mio codice senza la funzione precedente e funziona bene, voglio solo aggiungere un po 'di sicurezza.

Grazie!

+1

Evitare di cercare di disinfettare tutto per ogni contesto. Questo ostacola solo la tua applicazione e rende più difficile proteggere quando vuoi ricreare funzionalità perse. Questo è un valido motivo per cui magic_quotes è stato disabilitato. http://php.net/manual/en/security.magicquotes.php Qualcosa che stai ricreando in un certo senso qui. L'input deve essere disinfettato per l'applicazione a cui viene inviato. Se si sta inviando al browser tramite HTTP, disinfettarlo per HTTP e HTML. Se lo stai inviando al DB SQL, disinfettalo per SQL. – bucabay

+0

scusate, volevo dire deprecato: http://php.net/manual/en/security.magicquotes.php – bucabay

+0

Grazie per l'aiuto/consigli tutti! Sembra che ho bisogno di ripensare al mio processo. :-) – tscully

risposta

6

Quello che stai facendo non è sufficiente. Vedi here.

22

Utilizzare filter_input se possibile (php5 +) Lo mantiene molto più pulito e per quanto ne so è possibile disinfettare e convalidare tutto ciò che potrebbe essere necessario utilizzarlo.

È possibile utilizzare filter var array e per esempio FILTER_SANITIZE_STRING bandiera per filtrare l'intero post matrice

filter_var_array($_POST, FILTER_SANITIZE_STRING) //just an example filter 

Ci sono un sacco di diverse opzioni di filtro disponibili sui w3schools filter reference

+0

oh questo è fantastico!non l'ho mai visto prima :) – Mickey

+1

questo è il metodo migliore se hai php5 – robjmills

1

caselle deselezionate non vengono inviati al server .

è possibile utilizzare array_walk_recursive a fare quello che vuoi

6

per rendere la ricorsione più elegante si potrebbe usare qualcosa come array_map per esempio:

$_POST = array_map('mysql_real_escape_string',$_POST); 

Usa filtro var se è possibile anche se, come questo tipo di approcci sono generalmente male, solo un esempio però;)

1

Questo è il modo sbagliato di procedere con la pulizia dell'input.

L'applicazione di mysql coperta che fugge su tutto assolutamente in $_POST e $_GET sta per tornare indietro e mordervi, se si desidera continuare a utilizzare i dati dopo aver effettuato una query di database ma non si desidera che i caratteri di escape in Là.

Utilizzare query parametrizzate con mysqli o PDO e non sarà mai necessario utilizzare mysql_real_escape_string().

+0

Peggio ancora se non hai una connessione al database già avviato. – alex

+0

Ho la connessione impostata proprio sopra la chiamata di funzione, ma voi ragazzi non avete bisogno di vedere cosa ho lì. ;-) – tscully

+0

vedere: http://php.net/manual/en/security.magicquotes.php – bucabay