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

È necessario utilizzare mysql_real_escape_string(), quando magic_quotes_gpc è attivo?

Per alcune codifiche rare, come GBk - sì.
Ma non dovresti ripristinarlo per questo motivo. Le virgolette magiche dovrebbero comunque essere disattivate (e saranno nella prossima versione di PHP). Quindi, mysql_real_escape_string() è l'unica funzione di escape rimasta. Si noti che non è una funzione di prevenzione dell'iniezione di sql. Molte persone non capiscono questo punto:è solo una parte della sintassi. Deve essere utilizzato non per "proteggere" nulla, ma per assemblare query SQL sintatticamente corrette. E deve essere utilizzato ogni volta che crei la tua query, indipendentemente dalla provenienza dei dati. Sicuramente ti proteggerà anche dalle iniezioni SQL, come effetto collaterale.
Certo, mysql_real_escape_string() funziona solo all'interno di stringhe tra virgolette. Quindi, se lo fai

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

Non proteggerà nulla. Se hai intenzione di utilizzare numeri senza virgolette, deve essere cast al tipo corretto obbligatorio, in questo modo:

$num=intval($num);
$sql="SELECT INTO table SET data=$num"; /GOOD
  • Tieni presente che mo make mysql_real_escape_string() funziona come previsto, è necessario impostare la codifica client corretta ed è possibile solo con mysql_set_charset() funzione, la query SET NAMES non lo imposterà.

Se vuoi eliminare tutte queste complessità, puoi utilizzare dichiarazioni preparate , anche se dovrai cambiare il tuo driver mysql in mysqli o PDO.

Tieni presente che nessuna sintassi corretta o istruzioni preparate non ti aiuterebbero con parti di query diverse dai letterali. Non puoi sfuggire a identificatori o operatori. Se ti capita di utilizzare queste parti in modo dinamico, devono essere codificate nel tuo script, in questo modo (per la clausola ORDER BY):

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

o questa (clausola 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";