l'escape non risolve il problema al 100% ma riduce enormemente la superficie di attacco
va controllato tutto, non solo il $_POST ... vanno controllati tutti i parametri provenienti dall'esterno, ovvero $_GET, $_POST, $_COOKIE, $_SERVER (per quei parametri come il referer, l'user agent, la path e via dicendo) e $_FILES (per il nome del file)
In generale devi fare l'escape di TUTTO quello che carichi nel database.
L'escape, ad esempio, converte i ' in \\' il che significa che in un campo scrivi ' OR 1='1
Invece di eseguire una query del genere
SELECT * FROM tabella WHERE testo = '' OR 1='1'
che eseguirebbe il codice sql inserito, eseguirebbe questa query
SELECT * FROM tabella WHERE testo = '\\' OR 1=\\'1'
che cercherebbe una corrispondenza ovviamente inesistente, annullando quindi qualsiasi danno fattibile.
Ovviamente però ci sono altre situazioni, ovvero se passi valori "numerici" chi attacca non ha bisogno di inserire apici nelle stringhe, quindi se metti 1 OR 1 e lanci una query che cerca un id otterrai
SELECT * FROM tabella WHERE id = 1 OR 1
... ma la otterrai anche con l'escape!
Quindi l'importante è controllare i dati in ingresso e convertirli nei loro rispettivi valori prima di inserirli, ovvero se sai che il campo $_GET['id'] è numerico prima lo controlli con is_numeric e dai errore nel caso in cui non è numerico e poi, giusto per sicurezza, lo casti ad intero nella query.
Solitamente ho un metodo che mi costruisce la query a cui passo la data con i parametri da inserire tramite vsprintf ( www.php.net/vsprintf www.php.net/func_get_args )
in questo modo scrivo la query
SELECT * FROM id = %d
ed in automatico vsprintf mi effettua il cast a numero, ma per sicurezza lo metto pure io nei parametri che passo già castato ad intero

Rispondi quotando