mysql_real_escape_string () toute pour le tableau _REQUEST $, ou besoin de boucle à travers elle?

StackOverflow https://stackoverflow.com/questions/4223028

Question

Y at-il un moyen plus facile d'extraire en toute sécurité les variables soumises autres que ce qui suit?

if(isset($_REQUEST['kkld'])) $kkld=mysql_real_escape_string($_REQUEST['kkld']);
if(isset($_REQUEST['info'])) $info=mysql_real_escape_string($_REQUEST['info']);
if(isset($_REQUEST['freq'])) $freq=mysql_real_escape_string($_REQUEST['freq']);

(Et: voulez-vous utiliser isset() dans ce contexte?)

Était-ce utile?

La solution

Pour échapper à toutes les variables en une seule fois:

$escapedGet = array_map('mysql_real_escape_string', $_GET);

Extrait toutes les variables dans l'espace de noms en cours (à savoir $foo = $_GET['foo']):

extract($escapedGet);

S'il vous plaît ne pas faire cette dernière étape bien. Il n'y a pas besoin de, il suffit de laisser les valeurs dans un tableau. L'extraction paramètres peuvent entraîner des conflits de noms et écrasez des variables existantes, ce qui est non seulement un problème et une source de bugs, mais aussi un risque de sécurité. En outre, comme le dit @BoltClock, bâton à $_GET ou $_POST. Also2, comme points de @zerkms sur, il n'y a pas de point dans les variables mysql_real_escaping qui ne sont pas censées être utilisées dans une requête de base de données, il peut même conduire à d'autres problèmes.


Notez que vraiment pas de ceci est une idée particulièrement bonne du tout, vous êtes juste réincarner magic_quotes et global_vars, qui étaient horribles pratiques PHP depuis les siècles passés. Utilisation préparé états avec des paramètres liés via mysqli ou AOP et les valeurs d'utilisation à travers $_GET ou filter_input. Voir http://www.phptherightway.com .

Autres conseils

Vous pouvez également utiliser une fonction récursive comme celui-ci pour y parvenir

function sanitate($array) {
   foreach($array as $key=>$value) {
      if(is_array($value)) { sanitate($value); }
      else { $array[$key] = mysql_real_escape_string($value); }
   }
   return $array;
}
sanitate($_POST);

En ce qui me concerne Starx » et la réponse de Ryan du 19 '10 novembre est la meilleure solution ici que je voulais juste cela aussi.

Lorsque vous avez plusieurs champs d'entrée avec un nom (par exemple les noms []), ce qui signifie qu'ils seront enregistrés dans un tableau dans le $ _POST-tableau, vous devez utiliser une fonction récursive, comme mysql_real_escape_string ne fonctionne pas pour les tableaux.

C'est donc la seule solution pour échapper à une telle variable $ _POST.

function sanitate($array) {
    foreach($array as $key=>$value) {
        if(is_array($value)) { sanitate($value); }
            else { $array[$key] = mysql_real_escape_string($value); }
   }
   return $array;
}
sanitate($_POST);

Pour aseptiser ou valider toute INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER ou INPUT_ENV, vous pouvez utiliser

Le filtrage peut être fait avec un rappel, pour que vous puissiez fournir mysql_real_escape_string.

Cette méthode ne permet pas le filtrage pour $_REQUEST, parce que vous ne devriez pas travailler avec $_REQUEST lorsque les données sont disponibles dans l'un des autres superglobales. Il est potentiellement dangereux.

La méthode exige également de nommer les clés d'entrée, il est donc pas un filtrage par lots générique. Si vous voulez le filtrage par lots générique, l'utilisation array_map ou array_walk ou array_filter comme indiqué ailleurs sur cette page.

En outre, pourquoi vous utilisez l'ancienne extension mysql au lieu du mysqli (i pour améliorer) l'extension. L'extension mysqli vous donnera soutien à , multiqueries et

Si vous utilisez mysqli et l'extension que vous souhaitez échapper à toutes les variables GET:

$escaped_get = array_map(array($mysqli, 'real_escape_string'), $_GET);

Comme alternative, je vous conseille d'utiliser filtres d'entrée PHP7 , qui fournit un raccourci pour échapper sql. Je le recommande pas en soi, mais la création de variables localisées pièces de rechange:

 $_REQUEST->sql['kkld']

Ce qui peut être utilisé en ligne dans les chaînes de requête SQL, et donner un avertissement supplémentaire si vous l'oublier:

 mysql_query("SELECT x FROM y WHERE z = '{$_REQUEST->sql['kkld']}'");

Il est syntaxiquement discutable, mais permet seulement échapper à ces variables qui en ont vraiment besoin. Ou d'imiter ce que vous avez demandé, utilisez $_REQUEST->sql->always();

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top