W przypadku niektórych rzadkich kodowań takich jak GBk - tak.
Ale nie powinieneś tego cofać z tego powodu. Magiczne cytaty i tak powinny być wyłączone (i będą w następnej wersji PHP). Tak więc mysql_real_escape_string() jest jedyną pozostałą funkcją ucieczki. Zauważ, że nie jest to funkcja zapobiegająca wstrzykiwaniu sql. Wiele osób nie rozumie tego punktu:to tylko część składni. Musi być używany nie do "ochrony" czegokolwiek, ale do złożenia poprawnego składniowo zapytania SQL. I musi być używany za każdym razem, gdy tworzysz zapytanie, bez względu na to, skąd pochodzą dane. Z pewnością ochroni Cię również przed wstrzyknięciami SQL, jako efekt uboczny.
Oczywiście mysql_real_escape_string()
działa tylko w obrębie cytowanych ciągów. Tak więc, jeśli tak
$num=mysql_real_escape_string($num);
$sql="SELECT INTO table SET data=$num"; /BAD!!!
Nic nie będzie chroniło. Jeśli zamierzasz używać liczb niecytowanych, należy je rzutować na odpowiedni typ, obowiązkowo, na przykład:
$num=intval($num);
$sql="SELECT INTO table SET data=$num"; /GOOD
- Pamiętaj, że możesz utworzyć
mysql_real_escape_string()
działa zgodnie z przeznaczeniem, należy ustawić właściwe kodowanie klienta i jest to możliwe tylko zmysql_set_charset()
funkcja, zapytanie SET NAMES tego nie ustawi.
Jeśli chcesz pozbyć się tych wszystkich zawiłości, możesz użyć przygotowane zestawienia , ale będziesz musiał zmienić sterownik mysql na mysqli lub PDO.
Należy pamiętać, że żadna właściwa składnia ani przygotowane instrukcje nie pomogą w przypadku części zapytania innych niż literały. Nie można uciec od identyfikatorów ani operatorów. Jeśli zdarzy ci się używać tych części dynamicznie, muszą one być zakodowane na stałe w twoim skrypcie, tak jak to (dla klauzuli ORDER BY):
$orders=array("name","price","qty");
$key=array_search($_GET['sort'],$orders));
$orderby=$orders[$key];
$query="SELECT * FROM `table` ORDER BY $orderby";
lub to (klauzula 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";