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

Carenze di mysql_real_escape_string?

Il principale difetto di mysql_real_escape_string , o dell'estensione mysql_ in generale, è che è più difficile da applicare correttamente rispetto ad altre API più moderne, specialmente le istruzioni preparate. mysql_real_escape_string dovrebbe essere utilizzato esattamente in un caso:l'escape del contenuto di testo che viene utilizzato come valore in un'istruzione SQL tra virgolette. Es.:

$value = mysql_real_escape_string($value, $link);
$sql = "... `foo` = '$value' ...";
                     ^^^^^^

mysql_real_escape_string assicura che il $value nel contesto sopra non rovina la sintassi SQL. Non funziona come potresti pensare qui:

$sql = "... `foo` = $value ...";

oppure qui:

$sql = "... `$value` ...";

oppure qui:

$sql = mysql_real_escape_string("... `foo` = '$value' ...");

Se applicato a valori utilizzati in qualsiasi contesto diverso da una stringa tra virgolette in un'istruzione SQL, è applicato in modo errato e potrebbe o meno alterare la sintassi risultante e/o consentire a qualcuno di inviare valori che potrebbero abilitare attacchi SQL injection. Il caso d'uso di mysql_real_escape_string è molto ristretto, ma raramente viene compreso correttamente.

Un altro modo per entrare in acqua calda usando mysql_real_escape_string è quando si imposta la codifica della connessione al database utilizzando il metodo sbagliato. Dovresti fare questo:

mysql_set_charset('utf8', $link);

puoi fai anche questo però:

mysql_query("SET NAMES 'utf8'", $link);

Il problema è che quest'ultimo bypassa l'API mysql_, che continua a pensare che tu stia parlando con il database usando latin1 (o qualcos'altro). Quando si utilizza mysql_real_escape_string ora assumerà la codifica dei caratteri errata e le stringhe di escape in modo diverso da come il database le interpreterà in seguito. Eseguendo SET NAMES query, hai creato una spaccatura tra il modo in cui l'API del client mysql_ tratta le stringhe e il modo in cui il database interpreterà queste stringhe. Può essere utilizzato per attacchi injection in determinate situazioni di stringhe multibyte.

Non ci sono vulnerabilità di injection fondamentali in mysql_real_escape_string di cui sono a conoscenza se è applicato correttamente. Ancora una volta, però, il problema principale è che è terribilmente facile applicarlo in modo errato, il che apre delle vulnerabilità.