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

vulnerabilità di mysql_escape_string

La risposta negativa:

Non affidabile. Ti riferisci a mysql_escape_string() , che non tiene conto della codifica della connessione (mentre mysql_real_escape_string() fa).

Quindi forse una stringa realizzata con cura, con un codepoint UTF8 incompleto accuratamente realizzato davanti, potrebbe risulta, ad esempio, un segno di virgoletta che viene evitato da mysql_escape_string() ma l'escape stesso viene ignorato da MySQL poiché lo "vedrà" come un carattere UTF8.

Es.:

0xC2' OR 1=1 ;--

verrebbe sottoposto a escape da mysql_escape_string() come

0xC2\' OR 1=1 ;--

che verrebbe assemblato a

WHERE password='0xC2\' OR 1=1 ;--';

e visto da MySQL (se era in vigore la corretta codifica della connessione) come, ad esempio,

WHERE password='€' OR 1=1 ;[--';]    <-- the bracketed part is considered a comment and ignored

che sarebbe una classica SQL injection.

Ma questo gioca sul fatto che hai specificato, forse per distrazione, una funzione doppiamente deprecata . Se ti riferissi davvero a mysql_real_escape_string() , allora non funzionerebbe.

Inoltre, ciò presuppone che né il server, né il livello dell'applicazione (ad es. PHP) utilizzino alcun tipo di convalida del set di caratteri durante il popolamento dell'input. Se lo facessero, l'UTF8 non valido verrebbe cancellato all'arrivo e non sarebbe mai nemmeno visto da mysql_escape_string , che ovviamente sarebbe sufficiente.

La vera risposta:

Non utilizzare mysql_escape_string (o mysql_whatever ) affatto. Sono stati ritirati e il tuo codice potrebbe smettere di funzionare. Utilizzare invece le funzioni PDO.