# Consiglio su query e apici cercasi

**URL:** <https://www.ruby-forum.com/t/consiglio-su-query-e-apici-cercasi/187793>\
**Category:** IT\
**Created:** [April 29, 2010, 10:56am UTC](https://www.ruby-forum.com/t/consiglio-su-query-e-apici-cercasi/187793 "2010-04-29T10:56:30Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![daneel\_olivaw](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/58f4c7/32.png) [@daneel\_olivaw](https://www.ruby-forum.com/u/daneel_olivaw)\
**Post date:** [April 29, 2010, 10:56am UTC](https://www.ruby-forum.com/t/consiglio-su-query-e-apici-cercasi/187793/1 "2010-04-29T10:56:30Z")

</div>

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 🙂

---

<div class="post-metadata">

**Author:** ![daneel\_olivaw](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/58f4c7/32.png) [@daneel\_olivaw](https://www.ruby-forum.com/u/daneel_olivaw)\
**Post date:** [April 29, 2010, 11:06am UTC](https://www.ruby-forum.com/t/consiglio-su-query-e-apici-cercasi/187793/2 "2010-04-29T11:06:43Z")

</div>

Il 29 aprile 2010 10.56, Daneel O. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) 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](http://it.wikipedia.org/wiki/SQL_injection)  
[2] [http://wiki.rubyonrails.org/howtos/security/sql\_injection](http://wiki.rubyonrails.org/howtos/security/sql_injection)

---

<div class="post-metadata">

**Author:** ![daneel\_olivaw](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/58f4c7/32.png) [@daneel\_olivaw](https://www.ruby-forum.com/u/daneel_olivaw)\
**Post date:** [April 29, 2010, 11:41am UTC](https://www.ruby-forum.com/t/consiglio-su-query-e-apici-cercasi/187793/3 "2010-04-29T11:41:12Z")

</div>

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 🙂

> 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 🙂

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

---

<div class="post-metadata">

**Author:** ![daneel\_olivaw](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/58f4c7/32.png) [@daneel\_olivaw](https://www.ruby-forum.com/u/daneel_olivaw)\
**Post date:** [April 29, 2010, 11:08am UTC](https://www.ruby-forum.com/t/consiglio-su-query-e-apici-cercasi/187793/4 "2010-04-29T11:08:29Z")

</div>

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. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> 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: [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
site: [http://www.sistrall.it](http://www.sistrall.it)
