Newsgroup: it.comp.www.php
Titolo: consiglio su sql injection

Per evitare problemi relativi a sql injection utilizzo le solite
funzioni php: addaslashes, htmlspecialchars, ecc..
Attualmente utilizzo queste funzioni per ogni campo che va a comporre
il modulo utente, poi compongono la query e la eseguo. Siccome mi sono
stancato di richiamare quelle funzioni per ogni input, stavo pensando
di richiamarle un'unica volta nel metodo della classe utilizza per
interargire con Mysql.
In questo metodo gli passo direttamente la query e poi la eseguo.
Il problema se provo a fare addslashes($query), vado a fare il quoting
anche sugli apici della query stessa. Mi spiego meglio, se ho una query
del genere:
INSERT INTO tabella (t1) VALUES ('L'amaro in bocca')
l'addslashes aggiunge \ non solo su L\'amaro in bocca, ma anche agli
apici che racchiudono il valore.
Come posso fare per evitare tutto ciò? Come posso inserire gli \ solo
per il valore?
grazie anticipatamente

il valore?
io utilizzo questa 
http://it2.php.net/manual/it/function.mysql-real-escape-string.php
    prima 
di utilizzare l'sql. 

 di utilizzare l'sql.
grazie per avermi risposto, ma non è ciò che cercavo..
sto cercando qualcosa da poter applicare direttamente alla query.
mysql-real-escape-string, così come addslashes, aggiunge gli \ a tutta
l'istruzione sql
facendola diventare.
INSERT INTO tabella (t1) VALUES (\'L\'amaro in bocca\') ...
io invece cerco qualcosa che faccia il quoting solo ai valori contenuti
negli apici dell'INSERT...
cioè..
INSERT INTO tabella (t1) VALUES ('L\'amaro in bocca')
spero che ci sia una soluzione

negli apici dell'INSERT...
appunto....
$val="l'amaro in bocca";
$string=mysql_real_escape_string($a);
mysql_query("INSERT INTO tabella (t1) VALUES ('$string')");
prova a dare un occhiata se cosi' va meglio...

 prova a dare un occhiata se cosi' va meglio...
forse mi sono spiegato male... sò che si utilizza in questo, ma io
stò cecando di trovare un altro tipo di soluzione.
Attualmente, se ho 3 textbox in un modulo utente; ad esempio: nome,
cognome e via, sono costretto ad utilizzare 3 volte
mysql_real_escape_string
$nome = mysql_real_escape_string("Nicola");
$cognome= mysql_real_escape_string("Rossi");
$via= mysql_real_escape_string("Via dell'indipendeza");
e poi posso eseguire la query
mysql_query("INSERT INTO persona (nome, cognome, via) VALUES ('$nome',
'$cognome', '$via')
..
Io invece voglio utilizzare l'approccio inverso, ovvero creare subito
la query senza fare nessu quoting
$query = "INSERT INTO persona (nome, cognome, via) VALUES ('Nicola',
'Rossi', 'Via dell'Indipendeza'";
e poi utilizzare mysql_real_escape_string sulla query
mysql_real_escape_string($query);
Così facendo mi evito il "fastidio" di utilizzare
mysql_real_escape_string per ogni campo ti testo presente nel modulo,
questo diventa molto più fastidioso quante più sono le pagine che
contengono form...
Questa soluzione però inserisce \ anche dove non dovrebbe aggiungerli,
facendo diventare la query:
$query = "INSERT INTO persona (nome, cognome, via) VALUES (\'Nicola\',
\'Rossi\', \'Via dell\'Indipendeza\'";
mentre la query corretta che vorrei avere è la seguente:
$query = "INSERT INTO persona (nome, cognome, via) VALUES ('Nicola',
'Rossi', 'Via dell'Indipendeza'";
spero di essermi spiegato correttamente...

 contengono form...
Sono un niubbo, quindi potrei dire un mare di cavolate...
secondo me non c'è un modo per fare mysql_real_escape_string() di una 
query già completa, perchè non riesce a capire quale parte della stringa 
dovrà essere "escapata" :-P
Però potresti tentare un approccio diverso, il form credo che lo 
invierai tramite POST o GET, quindi se ti crei una funzione che "prende" 
le variabili dei form in $_GET o $_POST e a queste gli applichi 
mysql_real_escape_string() dovresti risolvere il problema e potresti 
creare la query senza tanti sbattimenti.

 creare la query senza tanti sbattimenti.
Si un'altra soluzione adottabile è questa, però rimane sempre il
"fastidio" di dover su ogni pagina che contiene un modulo analizzare
$_GET o $_POST.
Io ho una mia classe che mi permette di interagire con Mysql, tra i
vari metodi ce nè uno per l'insert, al quale gli passo direttamente la
query  da eseguire.
E' all'interno di questo metodo che vorrei trovare una soluzione per
aggiungere \ senza intaccare gli apici "regolari". Così risolvo i
problemi legati all'sql injection in un unico punto senza dover
ripetere le stesse funzioni su più pagine.
Naturalmente in questo metodo non avendo a disposizione nè $_GET nè
$_POST devo per forza agire sulla query e quindi affrontare questo
problema....
spero che ci sia una soluzione....

 $_GET o $_POST.
Ma il controllo lo dovresti fare soltanto una volta
faccio un esempio (prendi tutto con il beneficio del dubbio... )
se la struttura del tuo programma č fatto in modo che qualsiasi cosa 
richiama l'index.php ti basterebbe inserire nell'index.php una cosa del 
genere:
$_POST = escape_forms( $_POST );
dove la funzione escape_forms č:
function escape_forms( $data, $is_form=false ) {
   if ( is_array( $data ) ) {
     foreach ( $data as $key => $value ) {
       if ( $is_form===false && ( strncasecmp( $key, 'form', 4 ) == 0 ) ) {
         $data[$key] = escape_forms( $value, true );
       } elseif ( $is_form===true ) {
         $data[$key] = escape_forms( $value, true );
       } else {
         $data[$key] = escape_forms ( $value );
       }
     }
   } else {
     if ( $is_form===false )
       return $data;
     else
       return mysql_real_escape_string($data);
   }
}
a questo punto in tutti i campi dei tuoi form dovresti mettere nel 
"name" un prefisso "form_" e tutti i valori inviati tramite POST dal 
form verrebbero processati.
esempio:
<input type="text" name="form_nome">
<input type="text" name="form_cognome">
<input type="text" name="form_via">
La funzione escape_forms l'ho scritta senza provarla e non so se 
funziona o se puň comportare altri tipi di problemi... comunque anche se 
non funzionasse... con un qualcosa di simile dovresti risolvere, tutto 
ovviamente IMHO.

 ovviamente IMHO.
Già è difficile che funzioni... in più se mi dimentico un "return $data" 
alla fine del foreach... :-D
function escape_forms( $data, $is_form=false ) {
   if ( is_array( $data ) ) {
     foreach ( $data as $key => $value ) {
       if ( $is_form===false && ( strncasecmp( $key, 'form', 4 ) == 0 ) ) {
         $data[$key] = escape_forms( $value, true );
       } elseif ( $is_form===true ) {
         $data[$key] = escape_forms( $value, true );
       } else {
         $data[$key] = escape_forms ( $value );
       }
     }
     return $data;


$via= mysql_real_escape_string("Via dell'indipendeza");
e dov'e' il problema??   al limite potresti cambiare il nome dei textbox (x 
esempio in textbox[] ) facendolo poi diventare un array  , cosi' con un 
ciclo e con un mysql_real_escape_string ti risolvi il tutto.

 query  da eseguire.
Non accettare mai query gia` pronte in una classe. Fatti passare un
array e analizza quello.
A meno che tale classe non venga estesa da altre classi in cui fai tu i
controlli.
Bye.
-- 
Alessandro Pellizzari