sql >> Databasteknik >  >> RDS >> Mysql

Är det nödvändigt att använda mysql_real_escape_string(), när magic_quotes_gpc är på?

För vissa sällsynta kodningar, som GBk - ja.
Men du bör återställa det inte av denna anledning. Magiska citat bör ändå stängas av (och kommer att finnas i nästa PHP-version). Så mysql_real_escape_string() är den enda escape-funktionen som finns kvar. Observera att det inte är sql-injektionsförebyggande funktion. Många människor förstår inte denna punkt:det är bara en del av syntaxen. Den måste användas för att inte "skydda" någonting, utan för att sammanställa en syntaktisk korrekt SQL-fråga. Och måste användas varje gång du bygger din fråga, oavsett var data kommer ifrån. Visst kommer det att skydda dig från SQL-injektioner också, som en bieffekt.
Självklart, mysql_real_escape_string() fungerar endast inom citerade strängar. Så om du gör det

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

Det skyddar ingenting. Om du ska använda siffror utan citat, måste det gjutas till rätt typ obligatoriskt, så här:

$num=intval($num);
$sql="SELECT INTO table SET data=$num"; /GOOD
  • Tänk på att du gör mysql_real_escape_string() fungerar som avsett, korrekt klientkodning bör ställas in, och det är bara möjligt med mysql_set_charset() funktion, SET NAMES-frågan kommer inte att ställa in det.

Om du vill bli av med alla dessa komplexiteter kan du använda förberedda uttalanden , även om du måste byta din mysql-drivrutin till mysqli eller PDO.

Observera att ingen korrekt syntax eller förberedda uttalanden inte skulle hjälpa dig med andra frågedelar än bokstavliga. Du kan inte undkomma identifierare eller operatorer. Om du råkar använda dessa delar dynamiskt måste de hårdkodas i ditt skript, så här (för ORDER BY-satsen):

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

eller denna (WHERE-sats)

$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. Vad är det snabbaste sättet att infoga värden från datagridview till mysql-databasen

  2. Hur får man storleken på mysql-databasen?

  3. Importera flera .sql-dumpfiler till mysql-databasen från skalet

  4. Fel:Kolumnen finns inte