Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Muss mysql_real_escape_string() verwendet werden, wenn magic_quotes_gpc aktiviert ist?

Für einige seltene Kodierungen wie GBk - ja.
Aber aus diesem Grund sollten Sie es nicht zurücksetzen. Magische Anführungszeichen sollten sowieso abgeschaltet werden (und werden in der nächsten PHP-Version enthalten sein). Also ist mysql_real_escape_string() die einzige übrig gebliebene Escape-Funktion. Beachten Sie, dass es sich nicht um eine SQL-Injektionsverhinderungsfunktion handelt. Viele Leute verstehen diesen Punkt nicht:Es ist nur ein Teil der Syntax. Es darf nicht dazu dienen, etwas zu „schützen“, sondern um eine syntaktisch korrekte SQL-Abfrage zusammenzustellen. Und muss jedes Mal verwendet werden, wenn Sie Ihre Abfrage erstellen, unabhängig davon, woher die Daten stammen. Als Nebeneffekt schützt es Sie natürlich auch vor SQL-Injektionen.
Natürlich mysql_real_escape_string() funktioniert nur innerhalb von Zeichenfolgen in Anführungszeichen. Also, wenn Sie das tun

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

Es schützt nichts. Wenn Sie Zahlen ohne Anführungszeichen verwenden, müssen sie obligatorisch in den richtigen Typ umgewandelt werden, wie hier:

$num=intval($num);
$sql="SELECT INTO table SET data=$num"; /GOOD
  • Denken Sie daran, dass Sie mysql_real_escape_string() erstellen müssen wie beabsichtigt funktioniert, die richtige Client-Codierung sollte eingestellt sein, und es ist nur möglich mit mysql_set_charset() Funktion, SET NAMES Abfrage wird das nicht setzen.

Wenn Sie all diese Komplexitäten loswerden möchten, können Sie vorbereitete Erklärungen , obwohl Sie Ihren MySQL-Treiber auf mysqli oder PDO umstellen müssen.

Bitte beachten Sie, dass keine ordnungsgemäße Syntax oder vorbereitete Anweisungen Ihnen bei anderen Abfrageteilen als Literalen helfen würden. Bezeichner oder Operatoren können nicht maskiert werden. Wenn Sie diese Teile dynamisch verwenden, müssen sie wie folgt in Ihrem Skript fest codiert werden (für die ORDER BY-Klausel):

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

oder diese (WHERE-Klausel)

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