sql >> Database >  >> RDS >> Mysql

Is het nodig om mysql_real_escape_string() te gebruiken als magic_quotes_gpc aan staat?

Voor sommige zeldzame coderingen, zoals GBk - ja.
Maar u moet het niet om deze reden terugdraaien. Magische aanhalingstekens moeten sowieso worden uitgeschakeld (en zullen in de volgende PHP-versie zijn). Dus mysql_real_escape_string() is de enige escape-functie die nog over is. Merk op dat het geen sql-injectiepreventiefunctie is. Veel mensen begrijpen dit punt niet:het is slechts een deel van de syntaxis. Het moet niet worden gebruikt om iets te "beschermen", maar om syntactisch correcte SQL-query's samen te stellen. En moet elke keer dat u uw query maakt, worden gebruikt, ongeacht waar de gegevens vandaan komen. Natuurlijk zal het je ook beschermen tegen SQL-injecties, als bijwerking.
Natuurlijk, mysql_real_escape_string() werkt alleen binnen strings tussen aanhalingstekens. Dus, als je dat doet

$num=mysql_real_escape_string($num);
$sql="SELECT INTO table SET data=$num"; /BAD!!!

Het beschermt niets. Als je getallen gaat gebruiken die niet aangehaald zijn, moet het naar het juiste type worden gegoten, zoals dit:

$num=intval($num);
$sql="SELECT INTO table SET data=$num"; /GOOD
  • Houd er rekening mee dat mo make mysql_real_escape_string() werkt zoals bedoeld, de juiste clientcodering moet worden ingesteld en het is alleen . mogelijk met mysql_set_charset() functie, zal de SET NAMES-query dat niet instellen.

Als je van al deze complexiteiten af ​​wilt, kun je voorbereide verklaringen , hoewel u uw mysql-stuurprogramma moet overschakelen naar mysqli of PDO.

Houd er rekening mee dat geen juiste syntaxis of voorbereide instructies u niet zouden helpen met andere query-onderdelen dan letterlijke termen. U kunt niet ontsnappen aan Identifiers of operators. Als je deze delen toevallig dynamisch gebruikt, moeten ze hardcoded zijn in je script, zoals deze (voor de ORDER BY-clausule):

$orders=array("name","price","qty");
$key=array_search($_GET['sort'],$orders));
$orderby=$orders[$key];
$query="SELECT * FROM `table` ORDER BY $orderby";

of deze (WHERE-clausule)

$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";


  1. SQL Server 2016:Designer bekijken

  2. SQL Server:verschil tussen PARTITION BY en GROUP BY

  3. MySQL integer-vergelijking negeert achterliggende alfatekens

  4. Ruwe relevantiequery in Laravel. Hoe ermee om te gaan?