o Come Proteggere i Dati dell’Utente Da SQL Injection

xkcd

Fun Facts:

SQL injection è stato intorno praticamente mai da siti web per memorizzare i dati in un database.

Il progetto Open Web Application Security ha classificato gli attacchi injection come una delle 10 principali minacce per le applicazioni Web nel 2017.,

SQL injection è ancora responsabile di molte perdite di dati di grandi dimensioni. Nel 2016, i database di registrazione degli elettori dell’Illinois e dell’Arizona State Board of Elections sono stati violati. Mentre nessuna informazione è stata rubata in Arizona, in Illinois gli aggressori hanno avuto accesso ai dati degli elettori tra cui nome, indirizzo, data di nascita, sesso e numeri di previdenza sociale parziali, per circa 80.000 persone.⁴

È terrificante, che cos’è?

SQL injection è un tipo di attacco che mira al database di un’applicazione attraverso l’inserimento di codice non intenzionale nei campi di input dell’utente., Sfruttando la sintassi SQL, l’utente malintenzionato può utilizzare i campi di immissione per acquisire informazioni da tali database, incluse password e numeri di carte di credito. Qualcuno potrebbe anche prendere il controllo del database o eliminare tutte le informazioni che contiene.

Come funziona?

SQL Injection funziona utilizzando le informazioni inserite in un campo per manipolare l’istruzione SQL corrispondente nell’esecuzione di un’azione non intenzionale.,

Ecco un esempio di base:

SELECT * FROM customers WHERE name = " + user_name + ";

In questo esempio diciamo che la variabile user_name viene creata direttamente dall’input dell’utente su un sito web. Tale stringa viene inserita nell’istruzione SQL precedente e vengono restituiti tutti i campi relativi a tale nome utente. Niente di che.

Ma cosa succede se qualcuno digita Steve” O 1=1; – come nome utente? quindi l’SQL generato sarebbe questo:

SELECT * FROM customers WHERE name = "Steve" OR 1=1;--";

Poiché 1=1 è sempre vero, questo restituirebbe tutti i dati nella tabella. Non va bene!,

Let’s take one more look at that comic.

xkcd

The son’s name is Robert’); DROP TABLE students; — What would that do exactly?,

Beh, si può presumere che, se Poco Bobby Tabelle è stato aggiunto al database della scuola degli studenti, l’istruzione SQL sarebbe qualcosa come:

INSERT INTO students (name) VALUES ('<Student Name>');

… e quando si inserisce un Bobby…

INSERT INTO students (name) VALUES ('Robert'); DROP TABLE students;--');

Dal momento che Bobby nome”); i VALORI argomento è chiuso nel mezzo del suo nome e il testo che segue DROP TABLE studenti è una nuova istruzione SQL che cancella l’intera tabella. Infine – alla fine commenta il restante SQL, ignorando essenzialmente il resto del codice originale e assicurandosi che non si verifichi alcun errore.,

Quindi, Che Cosa Il Vostro Dire È Che I Miei Dati Non Potrà Mai Essere Di Nuovo Al Sicuro?

No! Ci sono in realtà un sacco di passi che si possono prendere per proteggersi da questo tipo di attacco. Diamo un’occhiata a pochi:

  1. Disinfettare i dati. Il primo passo è controllare ciò che l’utente è autorizzato a immettere. Il modo migliore per farlo è limitare i tipi di input consentiti per un determinato campo., Ad esempio, in un campo Numero di telefono è possibile consentire solo l’input numerico o in un campo e-mail consentire solo i caratteri che possono essere trovati in un indirizzo e-mail valido. Ovviamente, alcuni campi richiedono caratteri che potrebbero essere utilizzati in un attacco, quindi questo metodo non è imbattibile.
  2. Configura la segnalazione degli errori. Spesso la segnalazione degli errori predefinita nei sistemi di gestione del database contiene informazioni di debug dello sviluppatore. Ciò può restituire informazioni utili all’attaccante, come i nomi delle tabelle o dei nomi delle colonne., Assicurati di non mostrare questo tipo di informazioni agli utenti esterni in quanto potrebbe semplificare la vita di un potenziale attaccante.
  3. Usa i parametri associati. I parametri associati consentono di memorizzare i dati utente in una variabile e quindi inserirli in un’istruzione SQL creata con segnaposto. Poiché l’istruzione SQL e la variabile vengono inviate al server separatamente, i parametri associati sono buoni per proteggere dall’iniezione. Prendi quel piccolo Bobby T!, Un esempio di parametri associati in un metodo di aggiornamento in Ruby sarebbe simile a questa:
def update sql = <<-SQL UPDATE students SET name = ?, grade = ? WHERE id = ? SQL DB.execute(sql, )end

e ‘ pazzesco pensare che qualcosa di così semplice e comprensibile è ancora responsabile per così tante violazioni dei dati., Anche in casi di alto profilo come gli hack di registrazione degli elettori menzionati sopra e la recente violazione di Equifax (che non era dovuta a SQL injection, ma a una vulnerabilità simile che la società non è riuscita a risolvere), la radice della vulnerabilità si riduce all’errore umano e alla mancanza di attenzione ai dettagli. Dedicare del tempo a riflettere attentamente sul problema può aiutarci in modo significativo a proteggere i dati degli utenti da violazioni comuni, in particolare le iniezioni SQL.