SQL Injection — foydalanuvchi kiritgan ma’lumot orqali SQL so‘rovga zararli buyruq qo‘shib yuborish bilan bog‘liq xavfsizlik zaifligi. Bu zaiflik database bilan ishlaydigan web ilovalarda uchraydi.
SQL Injection odatda foydalanuvchi inputi to‘g‘ridan-to‘g‘ri SQL query ichiga qo‘shilganda paydo bo‘ladi. Natijada hujumchi database’dan ma’lumot o‘qishi, o‘zgartirishi yoki ayrim holatlarda o‘chirishi mumkin.
Vazifasi
SQL Injection tushunchasi database xavfsizligidagi zaiflik turini bildiradi. Bu zaiflik SQL so‘rovlar noto‘g‘ri tuzilganda yuzaga keladi.
SQL Injection orqali quyidagi xavflar paydo bo‘lishi mumkin:
- foydalanuvchilar ma’lumotlarini o‘qish;
- login tizimini aldash;
- maxfiy jadval ma’lumotlarini chiqarish;
- database yozuvlarini o‘zgartirish;
- ma’lumotlarni o‘chirish;
- admin huquqini qo‘lga kiritishga urinish;
- database strukturasini aniqlash;
- tizimdagi xavfsizlik cheklovlarini aylanib o‘tish.
Masalan, login formasida email va parol noto‘g‘ri tekshirilsa, zararli SQL qiymat login shartini o‘zgartirishi mumkin.
SQL Injection qanday paydo bo‘ladi?
SQL Injection foydalanuvchi inputi xavfsiz ishlovsiz SQL so‘rov ichiga qo‘shilganda paydo bo‘ladi.
Oddiy xato model:
- foydalanuvchi forma orqali ma’lumot kiritadi;
- backend bu qiymatni oladi;
- qiymat to‘g‘ridan-to‘g‘ri SQL string ichiga qo‘shiladi;
- foydalanuvchi kiritgan qiymat SQL buyruq sifatida talqin qilinadi;
- database noto‘g‘ri yoki zararli so‘rovni bajaradi.
Bu zaiflik SQL queryni matn sifatida qo‘lda yig‘ishda ko‘proq uchraydi.
SQL bilan bog‘liqligi
SQL — relational database bilan ishlash uchun ishlatiladigan so‘rov tili. SQL Injection aynan SQL so‘rovlar noto‘g‘ri tuzilganda yuzaga keladi.
SQL orqali bajariladigan amallar:
- ma’lumot o‘qish;
- ma’lumot qo‘shish;
- ma’lumot yangilash;
- ma’lumot o‘chirish;
- jadval yaratish;
- jadval strukturasini o‘zgartirish.
SQL Injection shu buyruqlarga begona yoki zararli qism qo‘shilishi bilan bog‘liq.
Zaif query namunasi
SQL Injection ko‘pincha string interpolation yoki string concatenation orqali query tuzilganda paydo bo‘ladi.
Masalan, quyidagi mantiq xavfli bo‘lishi mumkin:
SELECT * FROM users WHERE email = '<foydalanuvchi_email>' AND password = '<parol>';
Agar foydalanuvchi kiritgan qiymat SQL sifatida talqin qilinsa, queryning asl sharti o‘zgarib ketishi mumkin.
Bu yerda muammo SQL’ning o‘zida emas, balki foydalanuvchi inputini queryga xavfsiz ulash usulidadir.
Prepared statement
Prepared statement — SQL queryni oldindan tuzib, foydalanuvchi qiymatlarini alohida parametr sifatida berish usuli. Bu SQL Injectionga qarshi asosiy himoya usullaridan biridir.
Prepared statement ishlaganda:
- SQL query strukturasi oldindan belgilanadi;
- foydalanuvchi inputi SQL kod sifatida emas, qiymat sifatida uzatiladi;
- database query va parametrlarni alohida ko‘radi;
- zararli SQL bo‘lagi oddiy matn sifatida qabul qilinadi.
Masalan, email qiymati qanday bo‘lishidan qat’i nazar, u SQL buyruq emas, oddiy parameter sifatida ishlatiladi.
Parameterized query
Parameterized query — foydalanuvchi inputini SQL queryga xavfsiz parametr sifatida uzatish usuli. Bu prepared statement bilan yaqin tushuncha.
Parameterized query quyidagilarni ta’minlaydi:
- inputni SQL kod sifatida bajarilishining oldini olish;
- query strukturasi va qiymatlarni ajratish;
- database driver orqali xavfsiz uzatish;
- string concatenationdan qochish;
- SQL Injection xavfini kamaytirish.
Bu usul backend dasturlashda database bilan ishlashning xavfsiz modelidir.
ORM bilan bog‘liqligi
ORM — Object-Relational Mapping. ORM database jadvallarini dasturlash tilidagi obyektlar orqali boshqarishga yordam beradi.
Ko‘p ORM’lar parameterized query ishlatadi va SQL Injection xavfini kamaytiradi. Lekin ORM ishlatilgani zaiflik butunlay yo‘q degani emas.
SQL Injection ORM’da quyidagi holatlarda paydo bo‘lishi mumkin:
- raw SQL noto‘g‘ri yozilsa;
- foydalanuvchi inputi query fragment sifatida qo‘shilsa;
- dynamic filter xavfsiz tekshirilmasa;
- order by yoki column name inputdan olinib ishlatilsa;
- custom query string qo‘lda yig‘ilsa.
ORM xavfsizlikni osonlashtiradi, lekin noto‘g‘ri ishlatilsa zaiflik qoladi.
Input validation
Input validation — foydalanuvchi kiritgan qiymat kutilgan formatga mosligini tekshirish. SQL Injectionga qarshi yordamchi himoya hisoblanadi.
Input validation orqali:
- email format tekshiriladi;
- raqamli maydonga faqat raqam qabul qilinadi;
- uzunlik chegaralanadi;
- ruxsat etilgan qiymatlar ro‘yxati ishlatiladi;
- noto‘g‘ri belgilar rad etiladi.
Masalan, id maydoni faqat integer bo‘lishi kerak bo‘lsa, matnli qiymat qabul qilinmaydi.
Escaping
Escaping — maxsus belgilarni SQL ichida xavfsiz ko‘rinishga o‘tkazish jarayoni. Escaping ayrim holatlarda yordam beradi, lekin asosiy himoya sifatida parameterized query afzal hisoblanadi.
Escaping quyidagi belgilar bilan bog‘liq bo‘lishi mumkin:
- apostrof;
- qo‘shtirnoq;
- backslash;
- comment belgilar;
- SQL operatorlari.
Escaping noto‘g‘ri bajarilsa yoki database turiga mos bo‘lmasa, zaiflik saqlanib qolishi mumkin.
Authentication bypass
Authentication bypass — login tekshiruvini aldab o‘tish holati. SQL Injection login querylarida mavjud bo‘lsa, hujumchi noto‘g‘ri ma’lumot bilan ham tizimga kirishga urinishi mumkin.
Bu holat quyidagilar bilan bog‘liq:
- login formasi;
- email yoki username maydoni;
- password maydoni;
- SQL shartlarining noto‘g‘ri tuzilishi;
- input qiymatining queryga bevosita qo‘shilishi.
Authentication bypass SQL Injectionning eng mashhur xavfli ko‘rinishlaridan biridir.
Error-based SQL Injection
Error-based SQL Injection — database xatolik xabarlari orqali ma’lumot olishga asoslangan SQL Injection turi. Agar server database xatolarini foydalanuvchiga ochiq ko‘rsatsa, hujumchi query tuzilishi haqida ma’lumot olishi mumkin.
Error xabarlari quyidagilarni oshkor qilishi mumkin:
- database turi;
- jadval nomlari;
- ustun nomlari;
- query tuzilishi;
- backend texnologiyasi;
- SQL syntax xatosi.
Production muhitida database xatoliklari foydalanuvchiga batafsil ko‘rsatilmasligi kerak.
Blind SQL Injection
Blind SQL Injection — database xatolik yoki natijani ochiq ko‘rsatmasa ham, javobdagi farqlar orqali ma’lumot aniqlashga urinish turi.
Blind SQL Injection’da hujumchi:
- true/false shartlar yuboradi;
- sahifa javobi o‘zgarishini kuzatadi;
- vaqt kechikishidan foydalanadi;
- ma’lumotni bosqichma-bosqich taxmin qiladi.
Bu turdagi hujum ko‘proq vaqt oladi, lekin zaiflik mavjud bo‘lsa xavfli bo‘lishi mumkin.
Time-based SQL Injection
Time-based SQL Injection — database javob vaqtini sun’iy kechiktirish orqali ma’lumot aniqlashga urinish turi. Bunda sahifa ko‘rinishida katta farq bo‘lmasligi mumkin, lekin javob vaqti o‘zgaradi.
Bu yondashuvda:
- query ichiga vaqt kechiktiruvchi shart qo‘shiladi;
- server javob vaqti kuzatiladi;
- shart rost bo‘lsa, javob sekinlashadi;
- shart yolg‘on bo‘lsa, javob odatdagidek bo‘ladi.
Time-based SQL Injection blind SQL Injection turlaridan biridir.
UNION-based SQL Injection
UNION-based SQL Injection — SQL’dagi UNION operatori orqali boshqa query natijalarini asosiy query natijasiga qo‘shishga urinish turi.
Bu zaiflikda hujumchi:
- mavjud query tuzilishini aniqlashga urinadi;
- ustunlar sonini moslashtiradi;
- boshqa jadvaldan ma’lumot chiqarishga urinadi;
- natijani sahifada ko‘rishga harakat qiladi.
UNION-based SQL Injection natija foydalanuvchiga ko‘rsatiladigan querylarda xavfli bo‘lishi mumkin.
Least privilege
Least privilege — database foydalanuvchisiga faqat kerakli minimal huquqlarni berish prinsipi. Bu SQL Injection yuz bergan holatda zarar ko‘lamini kamaytiradi.
Masalan, web ilova ishlatadigan database user:
- faqat kerakli jadvallarni o‘qishi;
- kerakli joylarda yozishi;
- keraksiz
DROPyokiALTERhuquqlariga ega bo‘lmasligi; - admin huquqida ishlamasligi kerak.
Least privilege SQL Injectionni to‘liq to‘xtatmaydi, lekin oqibatini cheklaydi.
SQL Injection himoya usullari
SQL Injectionga qarshi asosiy himoya queryni xavfsiz tuzishdan boshlanadi.
Himoya usullari:
- prepared statement ishlatish;
- parameterized query ishlatish;
- ORM’ni to‘g‘ri ishlatish;
- raw SQL’dan ehtiyotkor foydalanish;
- input validation qilish;
- user inputni SQL fragment sifatida ishlatmaslik;
- database user huquqlarini cheklash;
- xatolik xabarlarini foydalanuvchiga batafsil chiqarmaslik;
- logging va monitoring orqali shubhali querylarni kuzatish.
Eng muhim himoya — foydalanuvchi inputini SQL koddan ajratish.
SQL Injection va API
API’larda SQL Injection request body, query parameter, path parameter yoki header qiymatlari orqali yuzaga kelishi mumkin.
API’da xavfli joylar:
- search endpoint;
- filter parametrlar;
- sort va order qiymatlari;
- login endpoint;
- report generatsiya;
- admin querylar;
- dynamic SQL ishlatiladigan joylar.
Masalan, /users?id=... endpointida id qiymati xavfsiz tekshirilmasa, SQL Injection xavfi paydo bo‘lishi mumkin.
SQL Injection va admin panel
Admin panellarda ko‘p filter, search, export va report funksiyalari bo‘ladi. Bu joylarda dynamic query ko‘p ishlatilgani uchun SQL Injection xavfi bo‘lishi mumkin.
Admin panelda xavfli joylar:
- foydalanuvchi qidirish;
- buyurtmalar filteri;
- sana bo‘yicha hisobot;
- eksport funksiyasi;
- role yoki permission filteri;
- custom report querylari.
Admin panel yuqori huquqli bo‘lgani uchun SQL Injection oqibati jiddiy bo‘lishi mumkin.
Dasturlashdagi o‘rni
SQL Injection database bilan ishlaydigan web ilovalar xavfsizligida eng muhim tushunchalardan biridir. U foydalanuvchi inputi SQL query ichida noto‘g‘ri ishlatilganda paydo bo‘ladi.
SQL Injection quyidagi tizimlarda e’tiborga olinadi:
- login va register tizimlari;
- admin panellar;
- internet do‘konlar;
- SaaS platformalar;
- CMS tizimlari;
- API backendlar;
- search va filter sahifalari;
- reporting tizimlari;
- banking va payment tizimlari.
SQL Injection foydalanuvchi inputi orqali database query tuzilishini o‘zgartirishga olib keladigan xavfsizlik zaifligidir.
Bog‘liq tushunchalar
SQL, Database, Query, Prepared statement, Parameterized query, ORM, Input validation, Escaping, Authentication, API, Web security, Security