mysql_real_escape_string () toute pour le tableau _REQUEST $, ou besoin de boucle à travers elle?
-
26-09-2019 - |
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?)
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
-
filter_input_array
- Obtient des variables externes et les filtres
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();