Newsgroup: it.comp.lang.visual-basic
Titolo: ricerca con apice

salve,
quando faccio una ricerca su di un db
Set db3 = db2.OpenRecordset("select * from anagrafe where cognome like '*" & 
(txtcognome.Text) & "*' order by nome")
e il nome è con l'apostrofo, non lo trova, quando digito il nome inserisco 
due volte l'apice, la ricerca funziona benissimo.
d'angelo (non lo trovo)
d''angelo (lo torva).
come posso fare
grazie  nico. 

io nelle stringhe di ricerca solitamente la prima cosa che faccio
è sostituire il carattere ' con ' + '''' + '
e poi chido il tutto con un apicetto iniziale e uno finale.
In alternativa invece di usare l'apicetto potresti usare le virgolette ad 
inizio e fine stringa. 

Scriveva nico giovedì, 12/06/2008:

Veramente hai già la risposta.
Se c'è un apice, devi metterne due. Un banale replace$ sistema tutto.
Alberto
-- 
Alessandro Bergonzoni: Il tempo vola e noi no. Strano sarebbe se noi 
volassimo e il tempo no, il cielo sarebbe pieno di uomini con 
l'orologio fermo.

 (txtcognome.Text) & "*' order by nome")
Aggiungo che una cosa del genere è di una pericolosità immane, non 
soltanto per il potenziale runtime error, quanto per la possibilità che 
si offre all'utente di eseguire codice sql 'libero'.
Conosco un sito che nella maschera di ricerca ha la textbox inserita 
nella query proprio in quel modo. Sapeste come mi ci sono divertito a 
navigare nel db...
Alberto
-- 
Ho spiegato a mio nipote cos'è il compromesso: se per le vacanze tua 
madre vuole andare al mare e tuo padre invece in montagna, il 
compromesso è che si va al mare, ma il papà può portarsi gli sci.

 nel db...
E come? Alla fine dovresti poter vedere solo i campi della select, e cercare 
solo sul campo cognome. O no?
Greg 

"greg" <gr...@tin.it.invalid> ha scritto

ho il fondato sospetto che alberto sia perfettamente in grado di scrivere 
nella textbox non un cognome ma una vera query, che poi verra' eseguita... 

andrea palazzi ha pensato forte :

Ovvio.
Non sono un profondo conoscitore della sintassi di Access, a cui mi 
sembra faccia riferimento l'OP come database, ma immagino esista un 
simboletto che fa iniziare un commento.
Ad esempio, immaginiamo di avere una ricerca su Sql-Server:
Recordset.Open "Select * from tabella where campo like '%" & 
textbox.Text & "%'"
Siamo, appunto, nelle condizioni iniziali.
Adesso immaginiamo che un utente che conosce la bestia, digiti, nella 
textbox:
pippo' DROP TABLE TABELLA --
Vediamo come verrebbe composta la stringa inviata da Ado a SqlServer:
Select * from tabella where campo like '%pippo' DROP TABLE TABELLA -- 
%'
Questo farebbe la query richiesta, ma subito dopo eseguirebbe un drop 
della tabella.
E' evidente che con Sql-Server o altri dbms serii, l'utente di 
esecuzione avrebbe autorizzazione Select ma non di modifiche alla 
struttura (Drop, Alter, Create, ecc...), e il DROP fallirebbe.
Ma anche solo una cosa tipo:
pippo' or 1=1 --
in un db con tabelle 'popolose', comporterebbe un flusso di dati 
talmente pesante che con due utenti che ti lanciano 'sta roba ti arriva 
un Denial of Service da paura...
Ciao
Alberto
-- 
Karl Marx: Le circostanze fanno l'uomo non meno di quanto l'uomo faccia 
le circostanze.

 of Service da paura...
Questa finisce subito tornando invariabilmente il primo record della 
tabella.
greg 

 struttura (Drop, Alter, Create, ecc...), e il DROP fallirebbe.
Già,
da poco però ho visto un bel attacco passando da una normalissima pagina 
asp che accettava parametri get.
Una parte del codice TSQL è stato passato in esadecimale ed è riuscito a 
ciucciarsi la struttura del database e a scrivere in ogni campo testo di 
ogni record di ogni tabella.
Naturalmente l'accesso al db era stato lasciato colpevolmente come "sa" 
(aaaaargh), altrimenti la struttura col cavolo che se la sarebbe presa, 
però ...
ciao
stefano

 Ovvio.
e' questa l'sql injection ?

 e' questa l'sql injection ?
esatto.
per approfondire:
http://it.wikipedia.org/wiki/SQL_injection
ciao
stefano

 tabella.
no, questa query ti restituisce invariabilmente tutti i record della 
tabella.
"select * from tabella where campo like 'xxxxx' or 1=1"
ti frega quel "or 1=1" perchè 1=1 è sempre vero.
ciao
stefano

 
se il motore db e' un server sql propriamente detto, la soluzione e' usare 
una stored procedure.
oltre a offrire altri vantaggi, gestisce gia' di suo questa situazione.
non so (non credo) se metta al riparo da sql injection, ma situazioni come 
apice o caratteri strani vengono gestite correttamente di default.
se pero' il database e' un mdb, una sp non si puo' fare, e allora imho 
conviene costruirsi una funzione di verifica, attraverso cui far passare 
tutti gli input utente, per rimuovere e/o gestire i caratteri riservati e 
le parole chiave (delete, drop, insert, etc...).
-- 
Paolo opg
BE AWARE that this post uses a fake reply-to address
to contact me write to:
janickg ( at ) hotmail ( dot ) com
--

 navigare nel db...
Lascia perdere... errori grossolani come questi li ho riscontrati su 
siti di grosse aziende, un paio delle quali operavano in ambito 
bancario, con tutti i rischi che ne conseguivano.
Possibile che una cosa così banale come il SQL Injection non venga presa 
in considerazione in progetti di quella portata?
Nicola

 ti frega quel "or 1=1" perchè 1=1 è sempre vero.
Ehm, riprovo. Ma poi, mi sfugge comunuque una cosa a livello di concetto: or 
1=1 ma dove? Nell'universo o in un campo di una tabella del database? Mi 
sembra che manchi qualcosa....
Riprovato, questa è la quesry:
Set rs = db.OpenRecordset("Select * from dipendenti where cognome = 
'bresciani' or 4=4")
MsgBox rs.RecordCount & " - " & rs!cognome
ossia: 1 - Piovesan
greg

 ha scritto nel messaggio
Comunque vado a fare un giro di google su "sql inject" non ne avevo mai 
sentito parlare :(
greg 

Il Fri, 13 Jun 2008 11:34:46 +0200, greg ha scritto:
[cut]
In generale quello che ha scritto Albe si identifica con l'attacco di tipo
"SQL injection" (googla): normalmente è un tipo di attacco riservato alle
applicazioni web (che devono essere parametrizzate, almeno quelle che
derivano dal front-end), ma vale anche per quelle desktop, se in mano a
utenti "bastard inside" :-)
PaF

 ha scritto nel messaggio 
news:m58go3hh5nqe$.17p6kdf0sxke3.dlg@40tude.net...

Ma per adesso sembra che Access sia immune (secondo wikipedia, mentre msdn 
dice che riguarda tutti i database)
Sto provando tutti i  costrutti che trovi, ma o non vengono eseguiti e danno 
errore. Forse è dovuto alla sintassi diversa.
Questa per esempio:
"select * from customers where companyname like '' ; select * from 
sys.tables -- '"ritorna: errore runtime 3142
Caratteri non previsti dopo la fine dell'istruzione SQL
Quindi sembrerebbe che l'sql di DAO ingnori il puntoevirgola di 
concatenamento
greg 

"greg" <gr...@tin.it.invalid> wrote in news:g2tmic$ujv$
1...@tdi.cu.mi.it
:

ma la tabella, quante righe contiene?
quanto al recordcount, fidati solo fino a un certo punto.
cosa succede se fai un ciclo sul recordset?
trovi qualcosa o effettivamente hai un solo record?
nel risultato di una SELECT, trovi quelle righe per cui sono verificate 
le condizioni impostate nella clausola WHERE
nel tuo caso, nel costruire il risultato il sistema analizza ogni riga 
della tabella/vista dipendenti e per ogni riga si chiede:
per questa riga, e' verificata la condizione cognome = 'bresciani'?
per questa riga, e' verificata la condizione 4 = 4?
dato che 4 e' sempre uguale a 4, questa condizione e' verificata per ogni 
e qualsiasi riga e visto che le condizioni sono in OR, il sistema riporta 
in uscita tutte le righe.


 per questa riga, e' verificata la condizione cognome = 'bresciani'?
e direi di no, ma mi tira fuori piovesan invece di bresciani!

 
va bene, ok, ma visto che le condizioni sono in OR...


 se fai un movelast e poi rileggi il recordcount?
Si, movelast e fist e ci sono tutti
greg

"greg" <gr...@tin.it.invalid> wrote in news:g2tsfi$6f1$
1...@tdi.cu.mi.it
:

recordcount colpisce ancora...
un po' come fare una chiave primaria di access con il tipo 'contatore'...
il nome ti frega.


Nicola Ottomano ci ha detto :

Beh, qui siamo in uno dei NG più popolati di persone competenti.
E sono convinto che con VB, anche col VB6 senza andare in .Net, ma già 
Asp alla fine è VB, esistano siti e software coi controcoglioni, che 
gestiscono roba serissima (ad esempio, i nostri gestiscono archivi di 
istituzioni pubbliche o contratti fra società private quotate in borsa, 
quindi più della collezione di dischi di un quindicenne).
Eppure anche qui dentro di questa cosa molti non ne sanno niente...
Alberto
-- 
Il tempo e la pazienza possono più della forza o della rabbia

greg ha usato la sua tastiera per scrivere :

Sarà solo una questione di ingegnarsi conoscendone bene la sintassi.
Ad esempio, il "Or 1=1", sono convinto che di danni ne possa fare a 
volontà.
Prova a scrivere nella textbox:
pippo' or 1=1 or 'ciao' = 'pippo
Ciao
Alberto
-- 
Il tuo stesso identico umore,
ma la divisa di un altro colore

 concatenamento
non capisco se e' cio' di cui si sta parlando, ma qui parla di query 
dinamiche
http://support.microsoft.com/kb/117544/en
Concatenating (joining) SQL statements in Access Basic requires that you 
"type cast" fields with special characters to instruct the Microsoft Jet 
database engine what field data types you are using.

 Alberto
Io l'ho letto oggi per la prima volta.
Ma dimmi solo una cosa Albe, per quale arcano motivo il parser di database 
serissimi dovrebbe accettare l'accodamento di un DROP ad un pacifico Select 
Cognome? Si tratta di un bug, una colpevole dimenticanza  dal momento che 
nel paio di libri che ho letto non ho mai trovato accenno ad un costrutto 
del genere?
-- 
Greg 

 il nome ti frega.
No no è solo che andavo di fretta perchè stavo provando diversi costrutti 
che man mano trovavo sul web.
Comuque devo dire che questa è lunica che colpise anche il Jet. Ma questa 
non la ciamerei neanche iniction, in fono è una normalissima select. Quella 
che mi lacia perlesso a livello di logica è la Select... Drop. Mi chiedo a 
quale prograttore possa mai servire....
-- 
Greg 

 chiedo a quale prograttore possa mai servire....
eh? stai usando un particolare dialetto sql? :PP

andrea palazzi ha scritto:

.... programmatore :)
-- 
Greg 

 .... programmatore :)
ok, abbiamo decodificato la order by.
ora, con molta calma, traduciamo la select from :))
ciao, a.

greg scriveva il 13/06/2008 :

Se hai bisogno di eseguire n operazioni in un unico batch, come fai?
E' una cosa utilissima, con millemila applicazioni.
Per impedire che venga usata a sproposito, esistono le autorizzazioni 
ad utenti, ruoli, login, da usarsi con un minimo di criterio.
Ciao
Alberto
-- 
Karl Marx: Uno scrittore è produttivo non nella misura in cui produce 
idee, ma nella misura in cui arricchisce l'editore che pubblica le sue 
opere.

 quale prograttore possa mai servire....
La select seguita da un drop è un esempio MALVAGIO che ti ha fatto Alberto.
Può essere utile in alcune circostanze concatenare, ad esempio, più insert.
Solo che a volte queste possibilità vengono usate malevolmente da 
qualche idiota, ecchecevoifà, il mondo è fatto così,
altrimenti non avresti bisogno di antivirus, portoncini blindati, 
allarmi e chi più ne ha più ne metta.
ciao
stefano

 E' una cosa utilissima, con millemila applicazioni.
DROP utilissima in seguito a SELECT  in millemila applicazioni!
Scusa Albe, mi puoi fare UN esempio di millemila in cui l'utente finale 
decide un DROP?
Io sarò antico ed eternamente principiante, ma sono abituato a:
- adesso (ogni secondo millisecndo) facciamo select (e scegli il campo da 
qui, mica ti faccio scrivere altrimenti perdi tempo e ti affatichi)
- adesso (è morto il Papa) facciamo il DROP, tu non preoccuparti faccio 
tutto io, rilassati!
-- 
Greg 

 decide un DROP?
Scusa greg, senza offesa, ma quanti anni hai?
Se sei ancora uno studente, capisco la tua domanda, ma se poco poco hai
lavorato in ambito enterprise, capisci che cose come questa sono
fondamentali.
Giusto per dirtene una: Stored Procedure.
Nei progetti che seguo ci sono stored procedure anche da 1000 linee, con
varie select seguite da delete, drop insert into ecc...
Immagina l'utilizzo nel comparto bancario (che è il settore dove lavoro
attualmente) con tabelle "grezze" che vanno organizzate in data mart.
Non si tratta di operazioni "una tantum" ma di vere e proprie
elaborazioni giornaliere (a volte in batch, a volte on-demand).
Ti ho fatto l'esempo bancario, ma ci sono migliaia di motivi per cui
vanno lasciati attivi certi comandi.
Non è un problema lasciarli attivi. Il problema è non pervederli in fase
di programmazione. Se tu sai che esistono attacchi di SQL Injection, fai
in modo di prevederli, esattamente come l'architetto di una casa deve
prevedere che possa nevicare e quindi costruire un tetto che resista al
peso della neve.
Nicola

 ha scritto nel messaggio 
news:6bg6k4F...@mid.individual.net...


 fondamentali.
Di anni ne h anche troppi :(  ma se faccio domande è proprio perche non 
capisco, non vorrei urtare nessuno, sia  ben chiaro.
Forse è perche le mie conoscenze sono limitate ad access, non ho la minima 
idea di quello che passa  sui grandi database e delle esigenze che ci sono, 
ma volevo dire semlicemente che se si spezza la query in due, una fa select 
e una fa drop, si modo di controllare meglio quello che passa nella 
text.box, e quindi nel momento di validazine della stringa vado ad eliminare 
parole come " drop " e altre pericolose, anche su DB come access  che non 
hanno tutta le gestione e i parametri di SQL server.
Poi io sono qui per imparare, di questa cosa non ne avevo mai sentito 
parlare, ed ecco il perchè di qualche domanda di troppo. Pardon.
-- 
Greg 

 io, rilassati!
Ironia stupida.
Se vuoi parlare seriamente, ne riparliamo.
Alberto
-- 
Karl Marx: Le circostanze fanno l'uomo non meno di quanto l'uomo faccia 
le circostanze.

 Alberto
Ok, scusa :(
Volevo solo dire, senza esserci riuscito,  che ponendo la select e la drop 
su 2 righe di codice diverse si abbassano i rischi.  Poi magari non si può e 
ci sono mille realtà che non conosco, e pure questo fenomeno è una cosa di 
cui manco sospettavo il nome fino a ieri. Pardon
-- 
Greg 

 (aaaaargh), altrimenti la struttura col cavolo che se la sarebbe presa,
Uccidere il sistemista in quel caso è cosa buona e giusta.
Bye, G. 

 Eppure anche qui dentro di questa cosa molti non ne sanno niente...
http://imgs.xkcd.com/comics/exploits_of_a_mom.png
 ;-)
Bye, G. 

 
No, assolutamente, la mia domanda era posta proprio senza alcun intento 
polemico. Era giusto per capire se stavo discutendo con un sedicenne o 
con un semplice appassionato senza esperienza in ambito enterprise.
Purtroppo la comunicazione testuale non aiuta a parsi capire.
Nicola