2013-05-01 12 views
7

Prima di tutto, capisco che le persone vogliano utilizzare le stored procedure in modo che riutilizzino le query e si occupino della fuga. Tuttavia, ho letto molti sviluppatori affermano che mysqli_real_escape_string non può impedire al 100% le iniezioni SQL. Qualcuno può fornire un esempio di questo?In che modo mysqli_real_escape_string non riesce a prevenire un'iniezione SQL?

Dalla mia limitata conoscenza sull'argomento direi che sarebbe mysqli_real_escape_stringsempre andare bene per le stringhe, ma per i valori numerici si potrebbe essere colti di sorpresa, a meno di controllare il numero è un int, float, double, ecc

EDIT: Ho dimenticato di aggiungere qualcosa di critico: supponiamo che il set di caratteri sia UTF8 e mysqli_set_charset sia stato chiamato di conseguenza. L'unica iniezione che ho visto si basa su una manciata di set di caratteri (nessuno dei quali è UTF8).

+6

[SQL injection che ottiene intorno mysql_real_escape_string()] (http://stackoverflow.com/questions/5741187/sql-injection-that-gets-around-mysql-real-escape-string) –

+0

+1, JW per il collegamento. –

+0

La risposta dal link è troppo appariscente per i miei gusti. –

risposta

6

Finché si utilizza mysqli_set_charset() per impostare la codifica del cliente, e mysqli_real_escape_string() viene utilizzato per formattare stringhe solo, è perfettamente sicuro.

Tuttavia, se la tua domanda implicita di utilizzare questa funzione nel codice dell'applicazione, invece che dietro le quinte di elaborazione di query di segnaposto-based o per lo meno in forma della funzione di PDO quote()-like (che non fuga e citando subito) è un modo dritto per l'iniezione.

Non è funzione stessa è un problema, ma il modo in cui viene utilizzato:

  • come fa solo parte di formattazione richiesto, si può facilmente dimenticare un'altra parte e scivolare in difficoltà
  • o persino può essere facilmente utilizzato in modo improprio, per formattare non una stringa ma un altro valore letterale che non trarrà alcun vantaggio dalla fuga.
  • in secondo luogo, quando viene utilizzato correttamente nel codice dell'applicazione, l'utilizzo diventa incoerente o occasionale, in quanto non è possibile forzare uno sviluppatore a formattare correttamente ogni letterale e senza errori. Questo di nuovo può portare a inesattezze e iniezioni.

Ecco perché si deve usare sempre un segnaposto per rappresentare i dati nella query (mentre mysqli_real_escape_string può essere utilizzato per elaborare questo segnaposto tutto bene)

+0

Ulteriori avvertenze [richieste] (http://stackoverflow.com/a/23277864) in modalità 'NO_BACKSLASH_ESCAPES' con valori letterali a doppia quotazione. – eggyal

Problemi correlati