Disinfezione dei parametri utente di MySQL
-
04-07-2019 - |
Domanda
Quali sono i caratteri pericolosi che dovrebbero essere sostituiti nell'input dell'utente quando l'input dell'utente verrà inserito in una query MySQL? Conosco citazioni, virgolette doppie, \ re \ n. Ce ne sono altri?
(Non ho la possibilità di utilizzare un connettore intelligente che accetta parametri, quindi devo creare la query da solo e questo verrà implementato in più linguaggi di programmazione, compresi alcuni oscuri, quindi soluzioni come mysql_real_escape_string
in PHP non sono validi)
Soluzione
mysql_real_escape_string () dai documenti mysql.com:
La stringa in from viene codificata in una stringa SQL con escape, tenendo conto del set di caratteri corrente della connessione. Il risultato viene inserito in e viene aggiunto un byte null di terminazione. I caratteri codificati sono NUL (ASCII 0), & # 8220; \ n & # 8221 ;, & # 8220; \ r & # 8221 ;, & # 8220; \ & # 8221 ;, & # 8220; '& # 8221 ;, & # 8220; " & # 8221; e Control-Z (vedi Sezione 8.1, & # 8220; Valori letterali & # 8221;). (A rigor di termini, MySQL richiede solo che la barra rovesciata e il carattere di virgolette utilizzato per citare la stringa nella query siano evitati. Questa funzione cita gli altri caratteri per renderli più facili da leggere nei file di registro.)
mysql_real_escape_string () è consapevole del set di caratteri, quindi replicare tutte le sue abilità (specialmente contro i problemi di attacco multi-byte) non è una piccola quantità di lavoro.
Da http://cognifty.com/blog.entry/id= 6 / addslashes_dont_call_it_a_comeback.html :
AS = addslashes() MRES = mysql_real_escape_string() ACS = addcslashes() //called with "\\\000\n\r'\"\032%_" Feature AS MRES ACS escapes quote, double quote, and backslash yes yes yes escapes LIKE modifiers: underscore, percent no no yes escapes with single quotes instead of backslash no yes*1 no character-set aware no yes*2 no prevents multi-byte attacks no yes*3 no
Altri suggerimenti
Quali lingue devi supportare? È molto meglio usare la sanificazione integrata di una lingua piuttosto che scriverne una tua.
Modifica: guardando mysql_real_escape_string
su php.net:
mysql_real_escape_string ()
chiama la funzione di libreria di MySQLmysql_real_escape_string
, che antepone barre rovesciate ai seguenti caratteri:\ x00
,\ n
,\ r
,\
,'
,"
e\ x1a
.