2010-04-07 13 views

Répondre

5

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 fonction mysql_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"; 
+0

Merci Col, très détaillé. – Zack

0

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

0

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.