2009-10-22 12 views
11

staram się wymyślić sposób, aby skutecznie łatwo oczyścić wszystkie POST i GET zmienne z jednej funkcji. Oto funkcja sama:

//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); 
    } 
} 

A oto kod, który by to nazwać:

//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); 
} 

Dla mnie to wydaje się, że powinna działać. Ale z jakiegoś powodu nie zwróci tablic z niektórych pól wyboru, które mam w formularzu. Wciąż wychodzą puste.

Przetestowałem mojego kodu bez powyższej funkcji i działa dobrze, po prostu chcę to dodaje trochę bezpieczeństwa tam.

Dzięki!

+1

Należy unikać próbuje zdezynfekować wszystko dla każdego kontekstu. To tylko przeszkadza twojej aplikacji i sprawia, że ​​trudniej jest ją zabezpieczyć, gdy chcesz odtworzyć utraconą funkcjonalność. Jest to ważny powód wyłączenia magic_quotes. http://php.net/manual/en/security.magicquotes.php Coś tu odtwarzasz w pewnym sensie. Dane wejściowe muszą być odkażone dla aplikacji, do której je wysyłasz. Jeśli wysyłasz do przeglądarki przez HTTP, odkaż go dla HTTP i HTML. Jeśli wysyłasz go do SQL DB, odkaż go dla SQL. – bucabay

+0

przepraszam, chciałem nieaktualne: http://php.net/manual/en/security.magicquotes.php – bucabay

+0

Dzięki za pomoc/poradę wszystkich! Wygląda na to, że muszę przemyśleć mój proces. :-) – tscully

Odpowiedz

22

Użyj filter_input jeśli to możliwe (php5 +) Utrzymuje to o wiele czystsze i o ile im wiadomo, możesz odkażać i zatwierdzić wszystko, czego potrzebujesz, używając go.

Można użyć filter var array i przykładowo FILTER_SANITIZE_STRING flagę filtrować cały szereg postu

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

Istnieje wiele różnych opcji filtrujących dostępnych na w3schools filter reference

+0

o, to jest niesamowite!Nigdy wcześniej tego nie widziałem :) – Mickey

+1

to najlepsza metoda, jeśli masz php5 – robjmills

6

aby rekurencji bardziej elegancki można użyć coś jak array_map na przykład:

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

Zastosowanie var jeśli potrafisz choć jak to rodzaj podejścia są na ogół złe, po prostu przykładem chociaż;)

1

to w niewłaściwy sposób, aby przejść o wejście do czyszczenia.

Stosowanie kociego mysql escaping do absolutnie wszystkiego w $_POST i $_GET powróci i ugryzie cię, jeśli nadal chcesz użyć danych po utworzeniu zapytania do bazy danych, ale nie chcesz, aby znaki tam.

Zastosowanie parametryzacji zapytań z mysqli lub PDO i nigdy nie będzie trzeba użyć mysql_real_escape_string().

+0

Jeszcze gorzej, jeśli nie masz połączenia z zainicjowaną bazą danych. – alex

+0

Mam połączenie ustawione tuż nad wywołaniem funkcji, ale nie musicie widzieć, co tam mam. ;-) – tscully

+0

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