Pour empêcher l'injection SQL, est-il nécessaire d'utiliser mysql_real_escape_string()
, lorsque magic_quotes_gpc
est activé?Est-il nécessaire d'utiliser mysql_real_escape_string(), quand magic_quotes_gpc est activé?
Répondre
Pour certains codages rares, such as GBk - oui.
Mais vous ne devriez pas le faire pour cette raison. Les guillemets magiques devraient être désactivés de toute façon (et seront dans la prochaine version de PHP). Donc, mysql_real_escape_string() est la seule fonction d'échappement qui reste. Notez que ce n'est pas la fonction de prévention d'injection de sql. Beaucoup de gens ne comprennent pas ce point: c'est juste une partie de la syntaxe. Il doit être utilisé pour ne pas "protéger" quoi que ce soit, mais pour assembler une requête SQL syntaxiquement correcte. Et doit être utilisé chaque fois que vous créez votre requête, peu importe d'où proviennent les données. Bien sûr, il vous protégera aussi des injections SQL, comme un effet secondaire.
Bien sûr, mysql_real_escape_string()
fonctionne uniquement dans les chaînes entre guillemets. Donc, si vous le faites
$num=mysql_real_escape_string($num);
$sql="SELECT INTO table SET data=$num"; /BAD!!!
Il ne protégera rien. Si vous allez utiliser des numéros sans guillemets, il doit être jeté au bon type obligatoire, comme ceci:
$num=intval($num);
$sql="SELECT INTO table SET data=$num"; /GOOD
- Gardez à l'esprit que mo faire
mysql_real_escape_string()
fonctionne comme le codage, le client approprié destiné doit être réglé, et il est possible seulement avec la fonctionmysql_set_charset()
, la requête SET NAMES ne définira pas cela.
Si vous voulez vous débarrasser de toutes ces complexités, vous pouvez utiliser prepared statements, si vous devez changer votre pilote mysql pour Mysqli ou AOP.
Veuillez noter qu'aucune syntaxe appropriée ou instructions préparées ne vous aideraient avec des parties de requête autres que des littéraux. Vous ne pouvez pas échapper les identifiants ou les opérateurs.Si vous arrive d'utiliser ces pièces de façon dynamique, ils doivent être codés en dur dans votre script, comme celui-ci (pour la clause ORDER BY):
$orders=array("name","price","qty");
$key=array_search($_GET['sort'],$orders));
$orderby=$orders[$key];
$query="SELECT * FROM `table` ORDER BY $orderby";
ou cette (clause WHERE)
$w=array();
if (!empty($_GET['rooms'])) $w[]="rooms='".mysql_real_escape_string($_GET['rooms'])."'";
if (!empty($_GET['space'])) $w[]="space='".mysql_real_escape_string($_GET['space'])."'";
if (!empty($_GET['max_price'])) $w[]="price < '".mysql_real_escape_string($_GET['max_price'])."'";
if (count($w)) $where="WHERE ".implode(' AND ',$w); else $where='';
$query="select * from table $where";
Merci Col, très détaillé. – Zack
oui c'est une bonne pratique d'exécuter toutes les valeurs qui vont dans votre instruction sql via le filtre mysql_real_escape_string() ce ne sont pas seulement des guillemets que le filtre corrige.
il empêche les attaques par injection, voir l'exemple sur le manuel de php pour la méthode.
http://php.net/manual/en/function.mysql-real-escape-string.php
regardant la documentation; http://php.net/manual/en/function.mysql-real-escape-string.php
Remarque: Si magic_quotes_gpc est activé, appliquez d'abord stripslashes() aux données. L'utilisation de cette fonction sur des données déjà échappées permet d'échapper deux fois les données.
Vous pouvez vérifier si magic_quotes_gpc est activé, voir l'exemple; http://php.net/manual/en/function.get-magic-quotes-gpc.php
Non et oui. Si magic_quotes
est activé et que mysql_real_escape_string
est appliqué, certaines échappements seront doublés, ce qui résulte en des choses comme "It\'s an example.
" que j'ai vues sur certains forums. Pour les meilleures pratiques, vous devez désactiver magic_quotes
et utiliser mysql_real_escape_string
tout le temps, ou mieux, utiliser une bibliothèque d'abstraction DB.
est pas mysql_real_escape_string meilleur pour lors de l'insertion de données dans MySQL? Et vous devriez utiliser magic_quotes_gpc pour la sécurité générale. – ggfan