Directory articoli
MySQLCome prevenire l'iniezione di sql? Principio e prevenzione dell'SQL injection
MySQL e SQL injection
Se prendi i dati inseriti dall'utente attraverso una pagina web e li inserisci in aDatabase MySQL, potrebbero esserci problemi di sicurezza di SQL injection.
Questo capitolo introdurrà come prevenire l'iniezione di SQL e filtrare i caratteri inseriti in SQL tramite gli script.
La cosiddetta SQL injection consiste nell'ingannare il server per eseguire comandi SQL dannosi inserendo comandi SQL nel modulo Web per inviare o inserire la stringa di query del nome di dominio o della richiesta di pagina.
Non dovremmo mai fidarci dell'input dell'utente, dobbiamo presumere che i dati di input dell'utente non siano sicuri e tutti dobbiamo filtrare i dati di input dell'utente.
Nell'esempio seguente, il nome utente inserito deve essere una combinazione di lettere, numeri e caratteri di sottolineatura e il nome utente deve avere una lunghezza compresa tra 8 e 20 caratteri:
if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches)) { $result = mysqli_query($conn, "SELECT * FROM users WHERE username=$matches[0]"); } else { echo "username 输入异常"; }
Diamo un'occhiata alla situazione SQL che si verifica quando non vengono filtrati caratteri speciali:
// 设定$name 中插入了我们不需要的SQL语句 $name = "Qadir'; DELETE FROM users;"; mysqli_query($conn, "SELECT * FROM users WHERE name='{$name}'");
Nell'istruzione di injection sopra, non abbiamo filtrato la variabile di $name.L'istruzione SQL di cui non abbiamo bisogno è inserita in $name, che cancellerà tutti i dati nella tabella users.
mysqli_query() in PHP non può eseguire più istruzioni SQL, ma SQLite e PostgreSQL possono eseguire più istruzioni SQL contemporaneamente, quindi è necessario verificare rigorosamente i dati di questi utenti.
Per prevenire l'iniezione di SQL, dobbiamo prestare attenzione ai seguenti punti:
- 1. Non fidarti mai dell'input dell'utente.Controlla l'input dell'utente, puoi usare espressioni regolari o limitare la lunghezza; converti virgolette singole e doppi "-", ecc.
- 2. Non utilizzare mai l'assembly dinamico sql, è possibile utilizzare sql parametrizzato o utilizzare direttamente le stored procedure per la query e l'accesso ai dati.
- 3. Non utilizzare mai connessioni database con privilegi di amministratore, utilizzare connessioni database separate con privilegi limitati per ciascuna applicazione.
- 4. Non archiviare informazioni riservate direttamente, crittografare o eseguire l'hashing di password e informazioni sensibili.
- 5. Le informazioni sull'eccezione dell'applicazione dovrebbero fornire il minor numero di suggerimenti possibile ed è meglio utilizzare le informazioni sull'errore personalizzate per racchiudere le informazioni sull'errore originale
- 6. Il metodo di rilevamento dell'iniezione sql adotta generalmente l'ausiliariosoftwareO la piattaforma del sito Web da rilevare, il software utilizza generalmente lo strumento di rilevamento dell'iniezione sql jsky e la piattaforma del sito Web ha lo strumento di rilevamento della piattaforma di sicurezza del sito Web Yisi. MDCSOFT SCAN et al.L'utilizzo di MDCSOFT-IPS può difendersi efficacemente da SQL injection, attacchi XSS, ecc.
Impedisci l'iniezione di SQL
Nei linguaggi di scripting come Perl e PHP è possibile eseguire l'escape dei dati inseriti dall'utente per impedire l'iniezione di SQL.
L'estensione MySQL per PHP fornisce la funzione mysqli_real_escape_string() per evitare caratteri di input speciali.
if (get_magic_quotes_gpc()) { $name = stripslashes($name); } $name = mysqli_real_escape_string($conn, $name); mysqli_query($conn, "SELECT * FROM users WHERE name='{$name}'");
Iniezione in dichiarazioni simili
Quando si esegue una query come, se l'utente inserisce valori con "_" e "%", ciò accadrà: l'utente originariamente voleva interrogare "abcd_", ma i risultati della query includono "abcd_", "abcde" e "abcdf " Ecc.; il problema si verifica anche quando l'utente vuole interrogare "30%" (nota: trenta per cento).
In uno script PHP possiamo usare la funzione addcslashes() per gestire la situazione precedente, come nell'esempio seguente:
$sub = addcslashes(mysqli_real_escape_string($conn, "%something_"), "%_"); // $sub == \%something\_ mysqli_query($conn, "SELECT * FROM messages WHERE subject LIKE '{$sub}%'");
La funzione addcslashes() aggiunge una barra rovesciata prima del carattere specificato.
Formato della sintassi:
addcslashes(string,characters)
参数 | 描述 |
---|---|
stringa | Necessario.Specifica la stringa da controllare. |
caratteri | Opzionale.Specifica il carattere o l'intervallo di caratteri interessati da addcslashes(). |
Speranza Chen Weiliang Blog ( https://www.chenweiliang.com/ ) ha condiviso "In che modo MySQL impedisce l'iniezione di sql? Principi e prevenzione dell'iniezione di SQL" per aiutarti.
Benvenuti a condividere il link di questo articolo:https://www.chenweiliang.com/cwl-500.html
Benvenuto nel canale Telegram del blog di Chen Weiliang per ricevere gli ultimi aggiornamenti!
📚 Questa guida contiene un valore enorme, 🌟Questa è un'opportunità rara, non perderla! ⏰⌛💨
Condividi e metti mi piace se ti va!
La tua condivisione e i tuoi like sono la nostra continua motivazione!