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.