English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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.
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}'");
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)
Parametri | Descrizione |
---|---|
stringa | Obbligatorio. Specificare la stringa da controllare. |
caratteri | Opzionale. Specificare i caratteri o l'intervallo di caratteri influenzati da addcslashes(). |
Vedi applicazioni specifiche qui:Funzione addcslashes() PHP