Newsgroup: it.comp.www.php
Titolo: Aiuto query dinamica

Ciao
Ho bisogno di un piccolo aiuto.
Ho una pagina web che ad ogni refresh visualizza i risultati di una 
query del tipo:
SELECT Nome FROM UTENTI;
Vorrei che nella suddetta pagina, al click su di un bottone, la query 
diventasse:
SELECT Nome FROM UTENTI WHERE Nome='Valore';
dove "Valore" � determinato dal bottone premuto.
Sapete mostrarmi, anche indicativamente, la via pi� corretta per 
realizzare una pagina con queste caratteristiche?
grazie!

La cosa pi� importante � scegliere cosa filtrare rispetto all'input 
dell'utente.
// versione base (NON SICURA!):
SELECT Nome FROM UTENTI WHERE Nome='".$_GET['valore']."';
Un semplice esempio reale pu� essere:
$nome_utente=trim(addslashes(stripslashes($_GET['valore'])));
SELECT Nome FROM UTENTI WHERE Nome='$nome_utente';
ciao
Marcello
alvise ha scritto:


Perfetto, � la risposta che cercavo.
Ti ringrazio.
alvise

 $nome_utente=trim(addslashes(stripslashes($_GET['valore'])));
Eppero` e` sbagliato.
if (get_magic_quotes_gpc()) {
 $valore = stripslashes($_GET['valore']);
} else {
 $valore = $_GET['valore'];
}
$nome_utente = mysql_real_escape_string(trim($valore));
MAI usare addslashes per fare l'escape dei dati da mettere in database.
Disattivando, come consigliato, il magic_quotes_gpc in php.ini, basta 
l'ultima riga.
Bye.

 l'ultima riga.
Non sarebbe più semplice usare un prepared statement?
Inoltre faccio presente che l'OP non ha detto che usa mysql, vabbè che
al 99.9999999% ci si azzecca, ma non si sa mai...

Il 2/26/10 11:44 AM, yossarian ha scritto:

Scusate la mia ignoranza...cosa si indende con "prepared statement"?...
Una particolare costruzione o un costrutto "preparato"?
grazie


http://www.php.net/manual/en/mysqli.prepare.php
Significa che prima 'prepari' la query indicando a database quali
campi sono variabili, lui la interpreta, la 'memorizza'.
Poi a ogni variabile tu gli assegni i valori ed esegui la query (detto
in parole povere).
Questo ha 3 vantaggi principali: il database riconosce la query
iniziale a se stante, quindi sono impossibili sql injection del tipo
che da un select aggiungi alla fine un DELETE, è molto più sicuro
contro le sql injection in generale, è molto più veloce se devi
eseguire la stessa query tante volte cambiando solo le variabili

 MAI usare addslashes per fare l'escape dei dati da mettere in database.
E perché mai? TRa l'altro mica sta inserendo i dati in DB, sta facendo 
una select...

 una select...
Non importa. Quando accedi a un DB e gli passi roba fornita dall'utente 
devi sempre farne l'escape. Ha ragione yossarian che andrebbero usate 
prepared statements (o PDO), ma mai addslashes.
Bye.

 prepared statements (o PDO), ma mai addslashes.
su questo sono d'accordo, soprattutto in contesti "astratti"...
In ogni caso vorrei vedere una SQL injection con la sintassi che ho 
proposto io su MySQL. Non credo sia possibile.
Se invece sì sarei MOLTO curioso di conoscerla :)

 curioso di conoscerla :)
Visto che stava prendendo roba dalla tabella users, l'attaccante avrebbe 
potuto passare valore pari a
' or true; --
che verrebbe trasformata in 
select Nome from utenti where nome='\' or true; --'
Che in SQLite non da` errori e torna una riga "a caso".
Bye.

 eseguire la stessa query tante volte cambiando solo le variabili
Molto chiaro, ti ringrazio.
alvise