Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Evitare ogni tipo di SQL injection

Quattro consigli pratici su come evitare attacchi di SQL Injection
Quattro consigli pratici su come evitare attacchi di SQL Injection
Link copiato negli appunti

Di seguito mi riferirò in particolare a MySQL: ogni DBMS ha suoi propri caratteri di controllo, quindi per ognuno di essi deve esistere un "escaping" dedicato.

1. Impostare la direttiva magic_quotes_gpc del php.ini ad ON.

Tale direttiva equivale ad un addslashes automatico sui caratteri considerati pericolosi relativi a tutte le stringhe passate via GET e POST e su tutto quanto salvato nei cookies.

Fare l'escape significa far precedere al carattere " ' " ed altri caratteri un backslah, di modo che, riferendoci a quanto visto prima, se inseriamo qualsiasi_stringa' OR 1 nel campo password, questo viene automaticamente convertito in qualsiasi_stringa' OR 1, vanificando ogni tipo di attacco.

Si deve tener presente però di non arrivare ad aggiungere backslash doppi o tripli, ciò che avviene se il programmatore, abituato a programmare con magic_quotes_gpc ad OFF, fa l'escape "a mano" egli stesso di tutte le stringhe in input: in questo caso risulterebbe qualcosa del tipo:

qualsiasi_stringa\' OR 1

in quanto l'escape viene fatto sia su " ' " che su " ".

Il programmatore deve quindi accertarsi dell'impostazione sulla direttiva del php.ini prima di decidere sul da farsi. Se ad OFF, usare addslashes; se ad ON no.

Ad esempio tramite un codice del tipo seguente:

function my_string_escape($stringa)
  {
  if (!get_magic_quotes_gpc()) $stringa=addslashes($stringa);
  return $stringa;
  }

Per svariate motivazioni, tuttavia, questo non è il metodo migliore.

2. Usare le funzioni di MySQL

In luogo dei magic_quotes o dell'addslashes "manuale", per fare l'escape dei caratteri pericolosi, è preferibile utilizzare le funzioni apposite che PHP mette a disposizione nell'interazione con MySQL.

È opportuno usare mysql_escape_string() oppure mysql_real_escape_string sulle variabili passate alle interrogazioni SQL.

Citando il manuale reperibile su PHP.net:

mysql_escape_string aggiunge le sequenze di escape in una stringa per l'uso in mysql_query.
Uso: string mysql_escape_string ( string stringa_senza_escape );
Questa funzione aggiunge le sequenze di escape a stringa_senza_escape, in modo che sia sicuro usarla in mysql_query().
Nota: mysql_escape_string() non aggiunge le sequenze di escape a " % " ed a " _ ".

Tale funzione (come addslashes) non fa l'escape di tutti i caratteri potenzialmente pericolosi, quali " % ", usati nelle query con LIKE, " ; " e " , ". Per questi è necessario uno str_replace "manuale".

3. Espressioni regolari

È bene valutare tramite espressioni regolari se quanto si riceve in input è conforme a quanto ci si aspetta di ricevere. Ad esempio, si intendiamo che una variabile contenga solo caratteri alfanumerici possiamo usare la seguente espressione regolare:

ereg("^[A-Z0-9]+$",$in)

per validarla. Oppure, se ci attendiamo come ingresso un codice postale, la seguente espressione fa al caso nostro:

preg_match('/^d{5}(-d{4})?$/',$CAP) 

 

Le espressioni regolari, se ben usate, sono un metodo sicuro per implementare un'applicazione non vulnerabile alle SQL injections.

4. Forzare il tipo di dato

Per i dati numerici, forzarli sempre ad essere effettivamente numerici all'atto del passaggio ad una interrogazione SQL tramite type casting: (int)$dato_numerico.

Ti consigliamo anche