Mysql
 sql >> Base de données >  >> RDS >> Mysql

Est-il nécessaire d'utiliser mysql_real_escape_string(), lorsque magic_quotes_gpc est activé ?

Pour certains encodages rares, comme GBk - oui.
Mais vous ne devriez pas revenir en arrière pour cette raison. Les guillemets magiques doivent être désactivés de toute façon (et le seront dans la prochaine version de PHP). Ainsi, mysql_real_escape_string() est la seule fonction d'échappement qui reste. Notez qu'il ne s'agit pas d'une fonction de prévention d'injection sql. Beaucoup de gens ne comprennent pas ce point :c'est juste une partie de la syntaxe. Il ne doit pas être utilisé pour "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, quelle que soit la provenance des données. Bien sûr, cela vous protégera également des injections SQL, comme 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!!!

Cela ne protégera rien. Si vous allez utiliser des nombres sans guillemets, ils doivent obligatoirement être convertis dans le type approprié, comme ceci :

$num=intval($num);
$sql="SELECT INTO table SET data=$num"; /GOOD
  • Gardez à l'esprit que mo make mysql_real_escape_string() fonctionne comme prévu, le codage client approprié doit être défini, et c'est possible seulement avec mysql_set_charset() fonction, la requête SET NAMES ne définira pas cela.

Si vous voulez vous débarrasser de toutes ces complexités, vous pouvez utiliser déclarations préparées , bien que vous deviez basculer votre pilote mysql vers mysqli ou PDO.

Veuillez noter qu'aucune syntaxe appropriée ni instruction préparée ne vous aiderait avec les parties de requête autres que les littéraux. Vous ne pouvez pas échapper aux identificateurs ou aux opérateurs. S'il vous arrive d'utiliser ces parties dynamiquement, elles doivent être codées en dur dans votre script, comme ceci (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 ceci (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";