Consiglio su query e apici cercasi

Salve lista; scusate lo schifo di oggetto, ma oggi la fantasia e
carente.

Il problema di oggi è: cercare e manipolare dati in un database con la
presenza di apici, cioè devo cercare e fare cose con un campo del
database che mi presenta anche cose del genere: “SOCIETA’ QUA E LA’ BLA
BLA ECC. ECC.”

Quando faccio una query di ricerca via active record tipo questa:

query = Rels.find(:first, :include => [:tab1, :tab2, :tab3], :conditions
=> “tab1.data1 = ‘#{var1}’ and tab2.data2 = ‘#{var2}’ and tab3.data3 =
‘#{var3}’”)

dove var1, var2 e var3 sono variabili contenenti i dati con gli apici
(precedentemente selezionati) e Rels come facilmente si può capire è una
tabella usata per mettere in relazione le altre 3.

Il problema è che quando mysql si trova davanti l’apice del testo di
var1 (per esempio) lo interpreta come chiusura della dichiarazione del
dato da ricercare in tab1.data1, con il risultato di andare in errore.

Ho risolto in questo modo piuttosto barbaro:

query = Rels.find(:first, :include => [:tab1, :tab2, :tab3], :conditions
=> “tab1.data1 = “#{var1}” and tab2.data2 = “#{var2}” and tab3.data3
= “#{var3}””)

cioè sostituendo gli apici con " .
Ho provato anche ad invertire gli apici con le virgolette (o doppi apici
a dir si voglia) che a volte risolve la situazione, ma questa volta non
ha funzionato.

C’è una soluzione più decente?
Voi come fareste/avete fatto?

Come sempre grazie in anticipo :slight_smile:

Il 29 aprile 2010 10.56, Daneel O. [email protected] ha
scritto:

Quando faccio una query di ricerca via active record tipo questa:

query = Rels.find(:first, :include => [:tab1, :tab2, :tab3], :conditions
=> “tab1.data1 = ‘#{var1}’ and tab2.data2 = ‘#{var2}’ and tab3.data3 =
‘#{var3}’”)

Ciao,

questo è un caso classico, e la tua applicazione è seriamente alla
ricerca di una SQL Injection [1].

Quello che devi fare è permettere ad ActiveRecord di fare quello che
sa fare, tra cui la sanitizzazione dell’SQL [2].

In particolare, scrivi la tua query
così:
Rels.find(:first, :include => [:tab1, :tab2, :tab3], :conditions =>
[“tab1.data1 = ? and tab2.data2 = ? and tab3.data3 = ?”, var1, var2,
var3])

In questo modo non avrai nessun problema con gli apici e la tua
applicazione sarà al riparo da malintenzionati, almeno per quanto
riguarda la SQL Injection.

pietro

[1] SQL injection - Wikipedia
[2] http://wiki.rubyonrails.org/howtos/security/sql_injection

Pietro G. wrote:

Ciao,

questo � un caso classico, e la tua applicazione � seriamente alla
ricerca di una SQL Injection [1].

Beh, per ora me le faccio da solo :slight_smile:

Quello che devi fare � permettere ad ActiveRecord di fare quello che
sa fare, tra cui la sanitizzazione dell’SQL [2].

In particolare, scrivi la tua query
cos�:
Rels.find(:first, :include => [:tab1, :tab2, :tab3], :conditions =>
[“tab1.data1 = ? and tab2.data2 = ? and tab3.data3 = ?”, var1, var2,
var3])

In questo modo non avrai nessun problema con gli apici e la tua
applicazione sar� al riparo da malintenzionati, almeno per quanto
riguarda la SQL Injection.

pietro

E il bello è che ho usato questo sistema da altre parti, ma col cavolo
che mi è venuto in mente… oltre che n00b anche con la memoria di
un’ameba… '-_-

Grazie per la pazienza e i suggerimenti :slight_smile:

Daneel O. e la vecchiaia che avanza (se qualcuno ne vuole un po’…)

Ciao,

io userei qualcosa come:

query = Rels.find(:first, :include => [:tab1, :tab2, :tab3],
:conditions => [‘tab1.data1 = ? and tab2.data2 = ? and tab3.data3
= ?’, var1, var2, var3])

In questo modo lasci a ActiveRecord l’ingrato compito di interpolare
correttamente la stringa con i valori delle variabili.

Ciao,
Silvano

2010/4/29 Daneel O. [email protected]:

query = Rels.find(:first, :include => [:tab1, :tab2, :tab3], :conditions


Considera l’ambiente prima di stampare questa email. Be a total user
rather than a complete waster.

. . . Silvano S. . . .
email: [email protected]
site: http://www.sistrall.it