In acest articol vom trata modul corect de a construi interogari in ColdFusion. Pentru ca acest limbaj de programare ne pune la dispozitie un tag foarte usor de folosit, suntem tentati sa ne aruncam intr-un <cfquery>
si sa nu ne mai uitam la detalii.
Nu ma intelegeti gresit. Nu spun sa nu folositi <cfquery>
. Mi se pare ca din toate limbjele de programare, ColdFusion ofera de departe cea mai comoda metoda de a accesa baza de date. Dar <cfquery>
nu este intotdeauna de ajuns. Este foarte important sa tinem cont de felul in care construim interogarile atunci cand folosim parametri.
Dupa cum stim, parametrii trimisi catre baza de date nu pot fi lasati “la liber”. Trebuie sa ne ferim de SQL Injection
si sa avem grija ca parametrul pe care il trimitem la baza de date este ceea ce ne asteptam noi. Aici ne vine in ajutor tag-ul <cfqueryparam>
. El se asigura ca parametrul trimis catre baza de date este “curatat” de tot ce este nociv si stie sa faca inclusiv o validare de baza.
Asadar sa vedem doua bucati de cod in care sa comparam cele doua metode de a scrie interogarile:
Primul exemplu nu foloseste tag-ul <cfqueryparam>
. Este doar o interogare in care am inserat o variabila. Si nu este gresit, merge. Doar ca nu este nici sigur. Veti vedea de ce.
<!--- Interogare fara cfqueryparam ---> <cfset cityName = "New York"> <cfquery name="qArtists1" datasource="cfartgallery"> SELECT * FROM artists WHERE city = '#cityName#' </cfquery>
In al doi-lea exemplu avem acelasi cod, cu diferenta ca parametrul este trimis catre SQL prin intermediul tag-ului <cfqueryparam>
. Si primul lucru pe care il observam este acela ca verificam ca parametrul sa fie de tip string. Deci, din start avem un avantaj.
<!--- Interogare cu cfqueryparam ---> <cfset cityName = "New York"> <cfquery name="qArtists2" datasource="cfartgallery"> SELECT * FROM artists WHERE city = <cfqueryparam value="#cityName#" cfsqltype="cf_sql_varchar"> </cfquery>
Exemplele de mai sus se vor comporta identic. Asta pentru ca variabila #cityName#
are o valoare corecta. Dar ce s-ar intampla daca am declara aceasta variabila un pic altfel? De exemplu:
<cfset cityName = "New York;DELETE FROM artists WHERE artistid > 0;">
Aici, tag-ul <cfqueryparam>
isi arata adevarata valoare. Daca am rula interogarea ca in primul exemplu, am ramane fara inregistrarile din tabela artists al caror id este mai mare decat zero (adica toate). In schimb, in exemplul al doi-lea, <cfqueryparam>
nu numai ca a filtrat query-ul de DELETE
, dar a stiut sa aplice filtrul “New York” pentru inregistrarile aduse.
Deci nu numai ca filtram SQL Injection
-ul din interogare, dar si pastram parametrul original, ceea ce inseamna ca nu ne va strica functionarea aplicatiei.
Concluzia: ColdFusion ne pune la dispozitie instrumente adecvate pentru cea mai mare parte din problemele comune cu care se intalnesc programatorii. Noi trebuie numai sa ne ne documentam si sa le adoptam pentru a profita la maxim de acest mediu de lucru.