Newsgroup: it.comp.www.asp
Titolo: query con dati pericolosi

come posso gestire al meglio delle query dove gli utenti mi mettono dati che
mandano in crisi l'sql?
ad esempio, ho un form web di ricerca dove l'utente mette i dati per le sue
ricerche.
l'asp crea una query sql e mette i filtri relativi (Where campo like
'sadasd' and..).
Solo che se l'utente mi mette un apostrofo nei campi testuali o un punto in
quelli numerici, salta tutto..
non vorrei fare procedure lunghe e complesse di ripulitura dei campi, anche
perchč apsotrofi e punti non sono nemmeno previsti dalla logica del sito
come parti di opzioni di ricerca da usare..
voi come fate?
ciao e grazie
oly...@mmstudio.it

come parti di opzioni di ricerca da usare..
Se apostrofi e punti non sono previsti, non serve ripulire i campi: basta
controllare che non ci siano. Piu' o meno come nell'esempio che segue
if (Instr (1, Request("Filtro"), " ' ") > 0) then
    numero_risultati = 0
elseif (Instr (1, Request("Filtro"), " . ") > 0) then
    numero_risultati = 0
else
    ' eseguo la query
end if
Gli spazi tra le virgolette, l'apostrofo e il punto sono solo per
leggibilita'; in realta' non ci vanno.
Ciao
Stefano

Beh se no sono previsti che li metta usa JS con un controllo o sul
submit della form o sul onBlur del campo
Ciao
Liga97
E-Mail: 
lig...@alo.it
ICQ: 11362849

voi come fate?
eh, bello mio, facciamo procedure lunghe e complesse di ripulitura.
le applicazioni funzionerebbero bene se non ci fossero gli utenti,
questo lo si sa.
per quello che riguarda stringhe con apostrofo ti hanno gia' postato
una routine, te ne puoi fare una anche per i punti dei numerici.
quando avrai fatto parleremo delle date... :-)
-----------------------------------
non studio non lavoro non guardo la tv non vado al cinema non faccio sport
-----------------------------------
togliete NOSPAM. per rispondermi via email
-----------------------------------
il sito comune di it.comp.database.access: 
http://members.xoom.it/it_db_access

quelli numerici, salta tutto..
Per quello che riguarda gli apici io uso questo sitema:
Replace(Request.Form("NomeCampo"),"'","''",1)
Per i punti, bisogna vedere se intendi i separatori dei decimali o quello
delle migliaia, cioe' se nell'SQL lasci 1.23 lui lo interpreta come 1
virgola 23 e quindi non da errore, mentre da errore se trova un carattere ,
Le soluzioni sono quindi:
se ti va bene usare il punto come separatore decimale puoi usare il
controllo nella form (se usi frontpage digli di usare un campo numerico
senza le , delle migliaia) e sei a posto
in caso contrario devi fare come con gli apici: se l'utente mette i . per le
migliaia e le , per i decimali devi prima sostituire i . con una stringa
vuota e poi sostituire l'eventuale , con il punto
Rimane da verificare che non ci siano troppi . e si puo' fare ad esempio
cosi':
   Numero = Request.Form("Numero")
   on error resume next
   Numero = clng(Numero)
   if err.num > 0 then
    Numero = 0
   err.num = 0
   end if
eventualmente invece di impostare numero a 0 puoi mostrare una pagina con
l'errore, oppure puoi mettere questo controllo nell'istruzione javascript di
verifica.
Giorgio Leonardi

 voi come fate?
io "parso" la stringa.
Ovvero tolgo o modifico (a volte raddoppio) i caratteri indesiderati.
    Paolo

Ovvero tolgo o modifico (a volte raddoppio) i caratteri indesiderati.
ma quali sono?
apici e apostofi per i testuali, ma altri?
per i numerici?
ciao ciao

...



visto che come ho risposto in realtà il comportamento di quelle routine era
scorretto, ho per ora tamponato la situazione in altro modo.
trapping degli errori del codice ed invio di una pagina che segnala
all'utente che ha fatto una cavolata, con indicate alcune possibili cause
(quelle che conosco)..
massima flessibilità su tutti gli errori possibile, un po' di limitazioni
volendo all'utente, ma tutto sommato non mi dispiace, visto che in dieci
minuti ho fatto in modo che l'applicaizione la smettesse dis crivermi errori
sul log di nt..
nell'attesa di sviluppare qualcosa di migliore per una gestione più
sensata..
che ne dici?
bye bye
oly...@mmstudio.it

controllare che non ci siano. Piu' o meno come nell'esempio che segue
non č che non siano presenti nei dati del db...
č che fondamentalemente non frega a nessuno di usarli nelle ricerche, sono
che qualcuno li usa e mi blocca l'sql...
quindi non deve restitituirmi nessun recordset di risposta, perchč sarebbe
scorretto..
ciao ciao

Rimane da verificare che non ci siano troppi . e si puo' fare ad esempio
uhm, mi sembra l'unica cosa...
come detto anche ad altri, mi lascia perplesso solo il fatto di non sapere
in effetti quali siano le combinazioni "pericolose"..
ciao ciao

 per i numerici?
In Access solo l'apice.
    Paolo

in effetti quali siano le combinazioni "pericolose"..
Da quel che ho capito ti puo' andar bene che se c'e' qualche carattere
sbagliato venga data segnalazione e rifiutato l'inserimento; in questo caso
la soluzione piu' semplice e' usare l'on error resume next.
Dopo ogni istruzione dubbia (ad esempio l'esecuzione dell'sql, oppure la
conversione di un campo del modulo in una variabile numerica) fai un test
sulla variabile err.number: se e' maggiore di 0 qualcosa non va bene, fai
una redirect ed esci dal file asp.
Volendo in certi casi puoi anche tentare di sistemare l'errore (ad esempio
se numerico cercando di togliere i caratteri diversi dai numeri), nel qual
caso ricordati di reimpostare l'err.number = 0 altrimenti in istruzioni
successivi continueresti a testare l'errore precedente.
Giorgio Leonardi