mercoledì 3 giugno 2009

Come proteggersi dalla SQL injection

English Francais Deutsch Espanol Russian Swedish Greek Portuguese Nederland Japanese Chinese Arabic korean Italian

La SQL injection è una tecnica dell'hacking che mira a colpire le applicazioni web che si appoggiano su un database di tipo SQL.

Le conseguenze prodotte sono imprevedibili per il programmatore: l'Sql Injection permette al malintenzionato di autenticarsi con ampi privilegi in aree protette del sito (ovviamente, anche senza essere in possesso delle credenziali d'accesso) e di visualizzare e/o alterare dati sensibili.

Strutturando le queries Sql in una particolare forma, nel caso specifico inserita in un indirizzo web (embedded in URLs), se essa viene passata ad un database sql con uno scarso controllo sulla strutturazione delle quesy di input, si constringe il server a restituire un messaggio di errore dal quale l'hacker esperto riesce a comprendere come è strutturato il database stesso e capisce quindi come riformulare la query per inserire dati (invece di leggere ... scrivere insomma) nel database.

L'obiettivo finale sarà quello di inserire un link ad una pagine web contenente codice maligno : ogni volta che quel database verrà caricato in un browser l'utente verrà reindirizzato al quel sito web maligno!




Vediamo ora Come proteggersi dalla SQL injection :

Da quanto si è visto , affinchè un attacco sferrato con la tecnica SQL injection funzioni , è sufficiente che il database risponda con messaggi di errore a query strutturate appositamente sbagliate.

Pertanto è facile concludere che l'unica possibilità di protezione è un buon controllo sui dati in input.

Quindi tutto è legato ad una buona stesura del codice php-sql da parte del programmatore durante lo sviluppo del programma.

Bisogna cioè assicurarsi che l'input ricevuto rispetti le regole necessarie, e questo può essere fatto in diversi modi:

  • controllare il tipo dei dati ricevuti (se ad esempio ci si aspetta un valore numerico, controllare che l'input sia un valore numerico);
  • forzare il tipo dei dati ricevuti (se ad esempio ci si aspetta un valore numerico, si può forzare l'input affinché diventi comunque un valore numerico);
  • filtrare i dati ricevuti attraverso le espressioni regolari (regex);
  • sostituire i caratteri pericolosi con equivalenti caratteri innocui (ad esempio in entità HTML, oppure utilizzando le funzioni addslashes e stripslashes di PHP);
  • effettuare l'escape dei dati ricevuti (ogni linguaggio, solitamente, mette a disposizione particolari funzioni per questo scopo).
  • nel caso del login cui sopra, criptare le credenziali di accesso prima di inserirle nella query SQL (evitare che le informazioni sensibili siano memorizzate nel DB in chiaro).
(wikipedia)

Nessun commento:

Posta un commento