Ներդրված SQL ը ամենատարածված եղանակներիցա ջարդուխուրդ անել սայթերն ու ծրագրերը, որոնք հիմնված են ինչ որ տվյալների բազայի վրա:Երբ որ սերվերի ադմինիստրաորը լավնա, փակելա բոլոր պորտերը, բացի 80-ից, ապա բացի վեբ-ից ուրիշ ճանապարհ չի մնում մտնել սերվեր:
Ներդրված SQL-ի գաղափարը
Իրականում իրենից ներկայացնում է շատ հասարակ մի բան, ու SQL-ի տարական գիտելիքներով կարելի է կիրառել (կիրառենք, որ հետո մեր հանդեպ չկիրառեն 🙂 ):
Երբ որ օգտագործողը լրացնումա ինչ որ ֆորմա ( ասենք լոգին պարոլ ) ու սղմում հաստատել, ապա ինչա տեղի ունենում… տեղի է ունենում հետևյալը ՝ օգտագործողի կողմից լրացված ինֆորմացիան որպես պարամետր փոխանցվումա սերվերի PHP կոդին ( հիմնականում GET կամ POST տարբերակներից մեկով) , որն էլ իր հերթին գեներացնումա SQL հարցում բազաին դիմելու համար: ու էտ ամեն ինչը շատ լավ արտացոլվումա բրաուզերի հրամանների տողում :
Հիմա պատկերացնենք ինչ կլինի, եթե User դաշտում գրենք ` OR1=1;/* իսկ Password դաշտում */–
Քանի որ ամեն դեպքում 1=1, ապա հարցման արդյունքը կլինի users աղյուսակը, իր էղած չեղածով:Իսկ թէ ինչ կարելիա արած էտ եղած չեղածի հետ արդեն ուրիշ հարցա:
մի այլ օրինակ: Բոլոր սայթերում էլ հիմնականում կան փնտրման դաշտ, որը նույնպես SQL սրսկելու ամենափափուկ մասերիցա…
օրինակ եթե http://www.trend.az/ -ի search դաշտում փնտրենք hello բառը, ապա բրաուզերի տողում կունենանք http://www.trend.az/search.php?words=hello, իսկ այ հելլոն իրանց շատա, կարելիա էքսպերիմենտներ անել Insert, Update, Delete, ու DROP հրամաններով 🙂
Ինչպես պաշտպանվել
Պաշտպանվելու համար անհրաժեշտա լուրջ ֆիլտրացիաի ենթարկել HTML – ի բոլոր ֆորմաներից եկող տվյալները, որոնց հիման վրա ձևավորվում են բազային դիմվող հարցումները:
- Մինչև SQL հարցում ձևավորելը ստուգեք ստացված պարամետրերը, հնարավորա ստուգել բազմաթիվ եղանակներով
- Ավելացնենք կրկնակի կավիչկաներ SQL ում, կամ օգտագործել հատուկ սիմվոլերը էկրանավորելու համար նախատեսված հակառակ սլեշ \ :
- Իսկ եթե ստացված պարամետրը թվային տիպ է ու հնարավոր չէ ինչ որ սիմվոլներ ավելացնել, ապա ամենաքիչը 3 կրիտերիաով ստուգում պետքա անել նոր ձևավորել հարցումը:
Կարծում եմ թվային տիպի դեպքում 1 կրիտերիայով ստուգումը բավարար է, այսինքն եթե վստահ ենք (preg_match('/^[0-9]+$/',$var)), որ ստացված պարամետրը թվային տիպ է ապա այևս ոչ մի ստուգման կարիք չկա տվյալ փոփոխականի հետ կապված: