In che modo MySQL impedisce l'iniezione di sql? Principio e prevenzione dell'SQL injection

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)
参数描述
stringaNecessario.Specifica la stringa da controllare.
caratteriOpzionale.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!

🔔 Sii il primo a ricevere la preziosa "Guida all'utilizzo dello strumento AI di marketing dei contenuti ChatGPT" nella directory principale del canale! 🌟
📚 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!

 

发表 评论

L'indirizzo email non verrà pubblicato. 必填 项 已 用 * 标注

滚动 到 顶部