PDA

View Full Version : [Java/Sql] Problema apice


GiulioCesare
31-03-2006, 12:13
Salve ragazzi ho un problema con l'esecuzione di una query insert, tramite una procedura java. Il problema è questo, devo inserire un record in una tabella, ma un campo di questa tabella, ha un apice al suo interno, e questo apice sql lo interpreta come carattere di fine stringa, quindi la query, mi va in errore. Premetto che per vari motivi non posso usare il prepate statement con java, ed ho provato a mettere il carattere \\, prima di ogni apice, ma il problema rimane, come posso risolverlo?
Grazie a chi vorrà aiutarmi :)

sottovento
31-03-2006, 12:31
Puoi salvare la stringa in formato XML?

ally
31-03-2006, 13:01
...ciao...

...hai indirettamente scoperto ci' che viene chiamato SQL Injection Attacks...

...formatta la query con un metodo simile a questo ed eventualmente trimma dagli spazzi i campi del resultset...

...ciao...



protected String format(String field) {
if (field != null) {
int rr = field.indexOf("'");
field = field.replaceAll("'", "''");
}
return field;
}

sottovento
31-03-2006, 13:40
...ciao...

...hai indirettamente scoperto ci' che viene chiamato SQL Injection Attacks...

...formatta la query con un metodo simile a questo ed eventualmente trimma dagli spazzi i campi del resultset...

...ciao...



protected String format(String field) {
if (field != null) {
int rr = field.indexOf("'");
field = field.replaceAll("'", "''");
}
return field;
}



Interessante! Puoi dare qualche info in piu'? Per esempio, come si viene sottoposti ad attacco, come fa ad infilare il codice, ...

High Flying
Sottovento

PS.


if (field != null) {
int rr = field.indexOf("'");
field = field.replaceAll("'", "''");
}

La indexOf() non serve a nulla

ally
31-03-2006, 13:49
...ciao...

....si l0index è assolutamente inutile...volevo vedere se eri attento...scherzo...anche il trim del result set non è importante per la risoluzione del tuo problema ma è utile per evitare problemi sui eventuali confronti...

...per quanto riguarda "l'attacco" non si fa altro che sfruttare questo finto bug sugli apici per modellare la query a nostro piacere...

...esempio...

...query = "select * from tabella where variabile = ' "+ valore +" ' ";

...ora se assegnamo alla variabile il valore ciccio' or '1' = '1 ci ritroveremmo una query così...

...query = "select * from tabella where variabile = 'ciccio' or '1' = '1' ";

...di conseguenza la query verrebbe corrotta ed estrarrebbe valori non richiesti...con le dovute modifiche la query puo' risultare veramente pericolosa...

...alla fine pero' basta un controllo sugli elementi che comporranno la nostra query per evitare problemi...

...ciao...

sottovento
31-03-2006, 14:04
Ok, quindi sta solo a vedere chi (e con quali intenzioni) ha messo l'apice nel campo della tabella di GiulioCesare, giusto?

Una domanda per GiulioCesare: quando hai provato a mettere il backslash davanti agli apici, immagino che tu abbia usato la replaceAll().
L'errore che faccio sempre e' quello di pensare che la replaceAll() cambi la stringa iniziale, per cui scrivo:

myString.replaceAll ("'", "\\\\'");
salvo poi accorgermi che non succede niente. E' per caso quanto hai fatto?
(Ovviamente era
myString = myString.replaceAll ("'", "\\\\'");

High Flying
Sottovento

GiulioCesare
31-03-2006, 14:28
Purtroppo anche con il metodo provosto da ally, si presenta lo stesso problema, comunque posto qui la query come viene modificata dal metodo, per capire dov'è l'errore, guardate all'ultimo campo dove c'è un link all'interno di quel campo, a separare i due url c'è un apice, che è quello da il problema, infatti viene generato un errore di sintassi lì

Insert into compagnia (
campo,campo,campo,campo,campo,campo,campo,campo,campo,campo,campo,campo,campo,campo,campo,campo,campo,campo,campo,campo,campo,campo,campo,campo,campo,campo,campo,campo,campo,campo,campo,campo,campo,campo,campo,campo,campo,campo,campo,campo,campo,campo,campo,campo,campo,campo,campo ) values (''1'',''CA'',''24 Sep 1980'',''Ce'',''S.P.A.'',''F.S.H..'',''Impiantica'',''999'',''32415'',''Fortgrup'',''5'',''VI'',''pippo@yahoo.it'',''P.I.A.'',''25Aug2005'',''A'',''A'',''1'',''1'',''03236870924'',''C'',''tr'',''(Impianti per centri elaborazionetesti)'',''587'',''1989'',''3'',''Gruppo'',''10400.00'',''0029-05-24'',''44324324'',''0'',''19 Feb 2006'',''S'',''60'',''19 Feb2002'',''20092423111'',''10400.00'',''200009240000237'',''S.P.A.'',''2002-02-07'',''128062'',''0034-11-23'',''90000000'',''INSERITO'',''Im
piantica'',''Via Cascilina'',''<a href=''http://www.google.com''>http://www.google.com</a>'')