Il tuo codice, nel contesto in cui l'hai esposto, è corretto.
Tuttavia occorre precisare una cosa: ogni parte del tuo progetto deve essere corretto, e deve esserlo anche al di fuori del contesto in cui lo stai analizzando, nei limiti del possibile.
perché se da qualche parte hai:
questo codice non lo è. E non lo è a prescindere se $login e $pass li filtri o li controlli da qualche altra parte prima. Non lo è e basta.codice:mysql_query("insert into user ('login','pass') values('$login', '$pass')" );
Se invece hai questo:
Hai altri tipi di problemi. Sebbene potrebbe valutarsi come corretto (una volta assicuratosi che la funzione myFilter funzioni a dovere) è ancora migliorabile. Perché è un approccio che ti predispone ad errori. Questo non è un caso da sottovalutare. Sebbene credi ci sia una possibilità su un diecimila che possa accadere di dimenticarti di usare myFilter, prendi atto che nella tua vita scriverai più di diecimila query.codice:mysql_query("insert into user ('login','pass') values('".myFilter($login)."', '".myFilter($pass)."')" );E comunque le probabilità che ciò accada non sono così basse
.
Inoltre c'è ancora una falla. Tu dici "ogni dato che viene inserito da un utente, prima di essere inserito nel database passa in mezzo a queste 2 funzioni". Ma le query possono anche usare parametri non direttamente presi dall'utente. Immagina, per esempio, la tua tabella utenti. Immagina che ogni utente abbia inserito la città. E immagina che nel tuo sito vuoi far vedere tutti gli utenti che abitano nella stessa città dell'utente loggato.
In questo caso banale, dai per buono un dato inserito da un utente precedentemente. Che è male.codice:$id = $_SESSION['user_id']; $res = mysql_query("select citta from user where id = $id"); $row = mysql_fetch_assoc($res); $citta = $row['citta']; $res = mysql_query("select * from user where citta = '$citta'"); // while ecc. ecc.
Io posso aver inserito come città:
Il tuo flusso ti funziona correttamente durante l'insert, ma non quando fai girare la mia sporcizia in giro per il database e nelle select.codice:Milano' UNION SELECT * from tabella_sensibile
E guarda che questa falla si scopre in un lampo. Basta accorgersi che gli utenti che abitano a L'Aquila rompono delle pagine, e il resto vien da se.
In definitiva. NO.
Il peggio che può accaderti non sono solo stringhe vuote nel database :-)
Il corretto approccio sarebbe quello di usare degli strumenti che ti obbligano a fare le cose per bene, e di usare i prepared statement sempre e comunque, per ogni dato. Stare a pensare ad ogni query cosa viene dall'utente e cosa no, ti predispone ad errori che sono:
- statistici (prima o poi ti capita di perdertene uno per strada)
- fisiologici (specifiche che cambiano. Un dato prima era statico e dopo 6 mesi lo rendi dinamico non adeguando tutto il resto del codice)

E comunque le probabilità che ciò accada non sono così basse
.
Rispondi quotando