Joomla: Come scrivere SQL sicure con LIKE per query di confronto di stringhe



Eseguire ricerche su un database utilizzando le stringhe prende un po ‘di più il pensiero del normale.
Ricerche String-based usare caratteri speciali per abilitare particolari funzionalità di ricerca che
non sono presenti quando si utilizzano gli operatori di base, come =.

Pertanto, si deve trattare di confronto
le stringhe in modo leggermente diverso per le stringhe normali (descritto nella ricetta precedente).
Sbagliare l’impostazione di una query SQL con la clausola LIKE può aumentare il pericolo di un attacco di tipo SQL injection.

Come prima cosa abbiamo bisogno del handler (gestore) del nostro database.
$db = & JFactory:: getDBO ();

Per effettuare una ricerca, Joomla utilizza spesso la funzione LIKE.
Questo funzione confronta due stringhe, carattere per carattere. Quando si utilizza LIKE, si possono includere i caratteri speciali % e _.
Questi rappresentano il concetto di  zero-a-molti e di singolo carattere.
Naturalmente, anche con i caratteri speciali dobbiamo porre una  particolare attenzione, se vogliamo usare i caratteri speciali, occorre segnalarli al sistema con un backslash.
In Joomla semplicemente la stringa di ricerca viene “circondata” con i caratteri %.
Noi risolveremo il problema utilizzando prima escaping e poi encapsulating.
Siamo in grado di aggiungere i bachslashs allastringa di confronto utilizzando il metodo JDatabase::getEscaped() e possiamo incapsulare la stringa di escape utilizzando il metodo JDatabase::Quote().

/ / Prepara ricerca
$escaped = $db->getEscaped($searchFor, true);
$quoted = $db->Quote(‘%’ . $escaped . ‘%’, false);
/ / Scrive il codice SQL
$like = $db->nameQuote(‘columnName’) . ‘ LIKE ‘ . $quoted;

Approfondimento …

Normalmente, quando si usa il  metodo JDatabase::Quote(),  alla stringa “passata” vengono automaticamente aggiunti i backslashs.
Però questa operazione non contempla i caratteri speciali ‘%  e _.
Quindi ?
Fortunatamente Joomla ci dà il metodo specifico JDatabase::getEscaped(), che accetta un secondo parametro opzionale booleano.
Questo parametro viene utilizzato per determinare se i caratteri extra,% e _, devono essere considerati.

Quindi per riassumere dobbiamo:

  1. aggiungere i backslashes.
  2. Circondare la stringa con il carattere %
  3. Aggiungere le virgolette singole


Secondo l’ordine indicato.


Leggendo l’esempio e guardando le variabili indicate nella tabella si capisce meglio il concetto.

Variabile
Valore
$searchFor Voglio il 25% del valore dei Blu_Bond
$escaped Voglio il 25 % del valore dei Blu _Bond
$quoted ‘%Voglio il 25% del valore dei Blu_Bond%’
$like ‘columnName’ LIKE ‘%Voglio il 25% del valore dei Blu_Bond%’

E ‘possibile rendere la ricerca un po’ più flessibile, sostituendo gli spazi con i caratteri%.
Il seguente codice di esempio mostra come possiamo raggiungere questo obiettivo:

// split the search into an array of words
$words = preg_split(‘~[s,.]+~’, $searchFor);
// iterate over the words
for ($i = 0; $i < count($words); $i ++) {
$words[$i] = $db->getEscaped($words[$i], true); }
// implode and quote the words
$quotedSearch = implode(‘%’, $words);
$quotedSearch = $db->Quote(‘%’ . $quotedSearch . ‘%’, false);
// write the SQL
$like = $db->nameQuote(‘columnName’) . ‘ LIKE ‘ . $quoted;

Questa volta si finisce con i seguenti valori:

Variabile
Valore
$searchFor Voglio il 25% del valore dei Blu_Bond
$words array(‘Voglio’,’il’,‘25%’, ‘del’, ‘valore’, ‘dei’, ‘Blu_Bond‘)
$words array(‘Voglio’,’il’,‘25%’, ‘del’, ‘valore’, ‘dei’, ‘Blu_Bond‘)
$quotedSearch Voglio%il%25%%del%valore%dei%Blu_Bond
$quotedSearch ‘%Voglio%il%25%%del%valore%dei%Blu_Bond%’
$like ‘columnName’ LIKE ‘%Voglio%il%25%%del%valore%dei%Blu_Bond%’

Gli spazi finali
La f
unzione LIKE può essere utile se vogliamo confrontare due stringhe e almeno una contiene degli spazi finali.
L’operatore = ignora gli spazi finali, per esempio ‘A3’ è considerata equivalente a ‘A3 ‘.
La funzione LIKE, invece considera le due stringhe diverse.


Annunci sponsorizzati:
Condividi su Facebook Condividi su Twitter!
Pinterest