2009-10-22 6 views
11

J'essaie de trouver un moyen de nettoyer facilement toutes les variables POST et GET avec une seule fonction. Voici la fonction elle-même:

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

Et voici le code qui l'appellerait:

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

Pour moi, cela semble que cela devrait fonctionner. Mais pour une raison quelconque, il ne retournera pas les tableaux de certaines cases que j'ai dans un formulaire. Ils continuent à sortir en blanc.

J'ai testé mon code sans la fonction ci-dessus et cela fonctionne très bien, je veux juste un peu plus de sécurité là-dedans.

Merci!

+1

Vous devriez éviter d'essayer de tout assainir pour chaque contexte. Cela ne fait que gêner votre application et la rendre plus difficile à sécuriser lorsque vous souhaitez recréer des fonctionnalités perdues. C'est une raison valable pour laquelle magic_quotes a été désactivé. http://php.net/manual/fr/security.magicquotes.php Quelque chose que vous recréez dans un sens ici. L'entrée doit être nettoyée pour l'application à laquelle vous l'envoyez. Si vous envoyez au navigateur via HTTP, désinfectez-le pour HTTP et HTML. Si vous l'envoyez à SQL DB, nettoyez-le pour SQL. – bucabay

+0

désolé, je voulais dire obsolète: http://php.net/manual/fr/security.magicquotes.php – bucabay

+0

Merci pour l'aide/conseil à tous! Il semble que je doive repenser mon processus. :-) – tscully

Répondre

6

Ce que vous faites ne suffit pas. Voir here.

22

Utilisez filter_input si possible (php5 +) Cela le rend beaucoup plus propre et, pour autant que je sache, vous pouvez désinfecter et valider tout ce dont vous pourriez avoir besoin.

Vous pouvez utiliser filter var array et par exemple FILTER_SANITIZE_STRING drapeau pour filtrer l'ensemble tableau de poste

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

Il y a beaucoup de différentes options de filtrage disponibles sur les W3Schools filter reference

+0

oh c'est génial!Je n'ai jamais vu cela avant :) – Mickey

+1

c'est la meilleure méthode si vous avez php5 – robjmills

1

Des cases non cochées ne sont pas envoyés au serveur .

vous pouvez utiliser array_walk_recursive pour faire ce que vous voulez

6

pour rendre la récursion plus élégante, vous pouvez utiliser quelque chose comme array_map par exemple:

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

Utiliser un filtre var si vous pouvez bien que ce genre d'approches sont généralement mauvais, juste un exemple bien;)

1

C'est la mauvaise façon de procéder pour nettoyer l'entrée. L'application de couverture mysql s'échappant à absolument tout dans $_POST et $_GET va revenir et vous mordre, si vous voulez toujours utiliser les données après avoir fait une requête de base de données, mais vous ne voulez pas les caractères d'échappement dans Là.

Utilisez des requêtes paramétrées avec mysqli ou PDO et vous n'aurez jamais besoin d'utiliser mysql_real_escape_string().

+0

Encore pire si vous n'avez pas de connexion à la base de données déjà lancée. – alex

+0

J'ai la connexion établie juste au-dessus de l'appel de fonction, mais vous n'avez pas besoin de voir ce que j'ai là. ;-) – tscully

+0

voir: http://php.net/manual/fr/security.magicquotes.php – bucabay