sql >> Database teknologi >  >> RDS >> Mysql

Er det nødvendigt at bruge mysql_real_escape_string(), når magic_quotes_gpc er slået til?

For nogle sjældne kodninger, såsom GBk - ja.
Men du bør vende det tilbage, ikke af denne grund. Magiske citater bør alligevel slås fra (og vil være i den næste PHP-version). Så mysql_real_escape_string() er den eneste escape-funktion, der er tilbage. Bemærk, at det ikke er sql-injektionsforebyggende funktion. Mange mange mennesker forstår ikke dette punkt:det er bare en del af syntaksen. Det skal bruges til ikke at "beskytte" noget, men til at samle en syntaktisk korrekt SQL-forespørgsel. Og skal bruges hver gang du bygger din forespørgsel, uanset hvor data kommer fra. Det vil selvfølgelig også beskytte dig mod SQL-injektioner, som en bivirkning.
Selvfølgelig, mysql_real_escape_string() virker kun inden for citerede strenge. Så hvis du gør

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

Det beskytter intet. Hvis du vil bruge tal uden anførselstegn, skal det castes til den korrekte type obligatorisk, som denne:

$num=intval($num);
$sql="SELECT INTO table SET data=$num"; /GOOD
  • Husk, at du laver mysql_real_escape_string() fungerer efter hensigten, skal korrekt klientkodning indstilles, og det er kun muligt med mysql_set_charset() funktion, vil SET NAMES-forespørgslen ikke indstille det.

Hvis du vil slippe af med alle disse kompleksiteter, kan du bruge forberedte erklæringer , selvom du bliver nødt til at skifte din mysql-driver til mysqli eller PDO.

Bemærk venligst, at ingen ordentlig syntaks eller forberedte udsagn ikke vil hjælpe dig med andre forespørgselsdele end bogstaver. Du kan ikke undslippe identifikatorer eller operatorer. Hvis du tilfældigvis bruger disse dele dynamisk, skal de hardkodes i dit script, sådan her (for ORDER BY-klausulen):

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

eller denne (WHERE-sætning)

$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. Skrivning af rekursiv CTE ved hjælp af Entity Framework Fluent syntaks eller Inline syntaks

  2. Hvad er databasetest, og hvordan udføres det?

  3. Hvordan migrerer jeg SQL Server-databasen til MySQL?

  4. Forskellen mellem venstre samling og venstre ydre samling