English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

注入 SQL MySQL

Se ricevete dati di input dell'utente tramite un sito web e li inserite in un database MySQL, potrebbe verificarsi un problema di sicurezza di iniezione SQL.

Questa sezione vi spiegherà come prevenire l'iniezione SQL e come filtrare i caratteri注入 nel SQL tramite script.

L'iniezione SQL è il tentativo di inserire comandi SQL in un modulo Web, un dominio o una stringa di ricerca di una pagina web per ingannare il server e farlo eseguire comandi SQL maliziosi.

Non dovremmo mai fidarci dell'input dell'utente, dobbiamo ritenere che i dati inseriti dall'utente siano insicuri e dobbiamo filtrare i dati inseriti dall'utente.

Nell'esempio seguente, il nome utente deve essere una combinazione di lettere, numeri e trattini di basso, e la lunghezza del nome utente deve essere tra 8 e 20 caratteri:

if ((preg_match("/^\w{8,20}$/", $_GET['username'], 	$matches)))
{
   $result = mysqli_query($conn, \ 
                          WHERE 	username=$matches[0]");
}
 else 
{
   echo \
}

Vediamo cosa succede senza filtrare i caratteri speciali:

// immetto $name SQL non desiderato
$name = "Qadir'; DELETE FROM users;";
 mysqli_query($conn, "SELECT * FROM users WHERE name='{$name}'");

Nelle query di iniezione elencate di seguito, non abbiamo filtrato la variabile $name, la variabile $name ha inserito uno SQL non desiderato, che eliminerà tutti i dati della tabella users.

In PHP, mysqli_query() non consente di eseguire più di una singola query SQL, ma in SQLite e PostgreSQL è possibile eseguire più query SQL contemporaneamente, quindi dobbiamo verificare strettamente i dati degli utenti.

Per prevenire l'iniezione di SQL, dobbiamo prestare attenzione a alcuni punti chiave:

  • 1. Non fidarsi mai dell'input dell'utente. Effettuare la convalida dell'input dell'utente, può farlo tramite espressioni regolari, o limitare la lunghezza; per apostrofi singoli e ecc.

  • 2. Non utilizzare mai la composizione dinamica di SQL, è possibile utilizzare SQL parametrizzato o direttamente stored procedure per le operazioni di query e archiviazione dei dati.

  • 3. Non utilizzare mai il database con permessi di amministratore, utilizzare una connessione database con permessi limitati per ogni applicazione.

  • 4. Non conservare informazioni riservate direttamente, crittografare o hashare le password e le informazioni sensibili.

  • 5. Le informazioni di eccezione dell'applicazione dovrebbero fornire il minor numero possibile di suggerimenti, meglio utilizzare messaggi di errore personalizzati per impacchettare i messaggi di errore originali.

  • 6. Metodi di rilevamento dell'iniezione di SQL generalmente utilizzano software o piattaforme di sito web per il rilevamento, i software generalmente utilizzano strumenti di rilevamento di iniezione di SQL come jsky, piattaforme di sito web come lo strumento di sicurezza del sito Yisi e MDCSOFT SCAN, ecc. L'uso di MDCSOFT-IPS può prevenire efficacemente l'iniezione di SQL, gli attacchi XSS, ecc.

Prevenzione dell'iniezione di SQL

In linguaggi di script come Perl e PHP, è possibile trasformare i dati di input dell'utente per prevenire l'iniezione di SQL.

L'estensione MySQL di PHP fornisce la funzione mysqli_real_escape_string() per trasformare i 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 di codice in una query like

Quando si esegue una query like, se l'utente inserisce un valore che contiene "_" e "%", si verifica questa situazione: l'utente voleva semplicemente cercare "abcd_", ma i risultati della ricerca includono "abcd_", "abcde", "abcdf" e così via; si verifica anche un problema quando si cerca "30%" (nota: trenta per cento).

Possiamo utilizzare la funzione addcslashes() nel nostro script PHP per gestire la situazione sopra, 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 invertita davanti ai caratteri specificati.

Formato sintattico:

addcslashes(stringa,charatteri)
ParametriDescrizione
stringaObbligatorio. Specificare la stringa da controllare.
caratteriOpzionale. Specificare i caratteri o l'intervallo di caratteri influenzati da addcslashes().

Vedi applicazioni specifiche qui:Funzione addcslashes() PHP