SQL Injection A'dan Z'gacha: Hujumni tushunish, aniqlash va bartaraf etish bo'yicha to'liq qo'llanma

SQL Injection (SQL inyeksiya) — bu tajovuzkor (hacker) tomonidan veb-sayt orqali ma'lumotlar bazasiga maxsus tayyorlangan zararli SQL so'rovlarini yuborish usuli. Agar veb-ilova foydalanuvchidan kelayotgan ma'lumotlarni to'g'ri filtrlamasa va tekshirmasa, bu hujum muvaffaqiyatli amalga oshadi.

Okt 19, 2025 - 16:54
Okt 19, 2025 - 17:01
 0  4
SQL Injection A'dan Z'gacha: Hujumni tushunish, aniqlash va bartaraf etish bo'yicha to'liq qo'llanma

Assalomu alaykum, KnowHub.uz o'quvchilari! Bugun biz veb-dasturlashdagi eng xavfli va ayni paytda eng keng tarqalgan zaifliklardan biri — SQL Injection haqida so'z yuritamiiz. Tasavvur qiling, siz mustahkam qilib qurgan uyingizning eshigiga notanish birov o'zining kalitini solib, bemalol kirib keta olsa... SQL Injection ham veb-saytingizning ma'lumotlar bazasi uchun xuddi shunday "universal kalit" vazifasini o'tashi mumkin.

Ushbu maqolada biz SQL Injection nima ekanligini oddiy so'zlar bilan tushuntiramiz, u qanday ishlashini amaliy misollarda ko'rib chiqamiz va eng muhimi, o'z loyihalaringizni bu kabi hujumlardan qanday qilib ishonchli himoya qilishni o'rganamiz.


SQL Injection o'zi nima?

Oddiy qilib aytganda, SQL Injection (SQL inyeksiya) — bu tajovuzkor (hacker) tomonidan veb-sayt orqali ma'lumotlar bazasiga maxsus tayyorlangan zararli SQL so'rovlarini yuborish usuli. Agar veb-ilova foydalanuvchidan kelayotgan ma'lumotlarni to'g'ri filtrlamasa va tekshirmasa, bu hujum muvaffaqiyatli amalga oshadi.

Natijada, tajovuzkor sizning ma'lumotlar bazangizdagi barcha ma'lumotlarni (foydalanuvchilarning login va parollari, shaxsiy ma'lumotlari, bank kartalari va hokazo) o'g'irlashi, o'zgartirishi yoki hatto butunlay o'chirib yuborishi mumkin.


Hujum qanday ishlaydi? (Klassik misol)

Keling, eng sodda misolni ko'rib chiqaylik. Ko'pgina saytlarda foydalanuvchini tizimga kiritish uchun login va parol so'raladigan forma mavjud. Dasturchi bu formadan kelgan ma'lumotlarni tekshirish uchun taxminan quyidagi SQL so'rovni ishlatadi:

SELECT * FROM users WHERE username = 'foydalanuvchi_nomi' AND password = 'foydalanuvchi_paroli';

Endi, agar dasturchi foydalanuvchi kiritgan ma'lumotni to'g'ridan-to'g'ri so'rovga qo'shib yuborsa, zaiflik yuzaga keladi. Masalan, PHP'da bu shunday ko'rinishda bo'lishi mumkin:

Zaif kod (PHP):

$username = $_POST['username'];
$password = $_POST['password'];

$sql = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";
// ... so'rovni bajarish kodi

Tajovuzkor bu zaiflikdan foydalanib, username maydoniga quyidagi qiymatni kiritadi: ' OR '1'='1' --

password maydoniga esa istalgan narsani yozishi mumkin.

Natijada, serverda shakllanadigan SQL so'rov quyidagi ko'rinishga keladi:

SELECT * FROM users WHERE username = '' OR '1'='1' -- ' AND password = 'random_password';

Keling, bu so'rovni tahlil qilamiz:

  • ' OR '1'='1' — bu shart har doim TRUE (rost) qiymatni qaytaradi (1 har doim 1 ga teng).

  • -- (ikkita chiziq) — bu SQL'da kommentariya belgisi. Bu belgidan keyingi qism (parolni tekshirish) e'tiborga olinmaydi.

Yakunda, ma'lumotlar bazasi "barcha foydalanuvchilarni tanlab ol, qayerdaki username bo'sh YOKI 1=1 bo'lsa" degan buyruqni qabul qiladi. 1=1 doim to'g'ri bo'lgani uchun, bu so'rov users jadvalidagi birinchi foydalanuvchini (ko'pincha bu administrator bo'ladi) qaytaradi va tajovuzkor hech qanday parol kiritmasdan saytga administrator huquqida kirib oladi!


SQL Injection'ning Xavfi va Oqibatlari

  • Ma'lumotlar o'g'irlanishi: Foydalanuvchilarning shaxsiy ma'lumotlari, kredit karta raqamlari va boshqa maxfiy axborotlar o'g'irlanishi mumkin.

  • Ma'lumotlarning buzilishi: Tajovuzkor ma'lumotlarni o'zgartirishi yoki butunlay o'chirib yuborishi mumkin.

  • Avtorizatsiyadan aylanib o'tish: Yuqoridagi misolda ko'rganimizdek, tizimga parolsiz kirish imkoniyati paydo bo'ladi.

  • Serverni to'liq boshqaruvga olish: Ba'zi hollarda, tajovuzkor ma'lumotlar bazasi orqali serverning fayl tizimiga kirish va serverni to'liq nazorat ostiga olishi mumkin.


Eng Muhimi: Qanday Himoyalanish Kerak?

Yaxshi xabar shundaki, SQL Injection'dan himoyalanish mumkin va bu unchalik qiyin emas. Eng muhimi — foydalanuvchidan kelayotgan ma'lumotlarga hech qachon ishonmaslik!

1. Parametrlangan so'rovlar (Prepared Statements)

Bu SQL Injection'ga qarshi kurashishning oltin standarti hisoblanadi. Bu usulda SQL so'rovining shabloni (strukturasi) va unga qo'yiladigan ma'lumotlar (parametrlar) alohida-alohida yuboriladi. Ma'lumotlar bazasi ularni hech qachon aralashtirib yubormaydi va foydalanuvchi kiritgan ma'lumotni faqat matn sifatida qabul qiladi, buyruq sifatida emas.

PHP'da PDO bilan misol (TAVSIYA ETILADI):

// Ma'lumotlar bazasiga ulanish
$pdo = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);

// 1. So'rovni tayyorlash (parametrlar o'rniga so'roq (?) belgisi)
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = ? AND password = ?");

// 2. Parametrlarni so'rovga bog'lash va bajarish
$username = $_POST['username'];
$password = $_POST['password'];
$stmt->execute([$username, $password]);

// 3. Natijani olish
$user = $stmt->fetch();

Bu kodda tajovuzkor ' OR '1'='1' -- kabi qiymatni yuborsa ham, PDO buni shunchaki matn sifatida qabul qiladi va ma'lumotlar bazasidan aynan shunday nomga ega foydalanuvchini qidiradi. Bunday foydalanuvchi mavjud bo'lmagani uchun hujum o'z samarasini bermaydi.

2. ORM (Object-Relational Mapping) dan foydalanish

Agar siz Laravel (Eloquent ORM) yoki CodeIgniter kabi zamonaviy freymvorklardan foydalansangiz, ular odatda o'zlarining ma'lumotlar bazasi bilan ishlash mexanizmlarida parametrlangan so'rovlardan foydalanadilar. Bu esa sizni SQL Injection xavfidan avtomatik tarzda himoya qiladi.

Laravel Eloquent misoli:

$user = User::where('username', $request->username)
             ->where('password', $request->password)
             ->first();

Bu kod ham "kapot ostida" parametrlangan so'rovlarni ishlatadi va to'liq xavfsizdir.

3. Minimal Imtiyozlar Prinsipi (Principle of Least Privilege)

Veb-saytingiz ma'lumotlar bazasiga ulanadigan foydalanuvchiga (user) faqat o'zi bajarishi kerak bo'lgan amallar uchun ruxsat bering. Masalan, agar ilovangizga jadvallarni o'chirish (DROP TABLE) kerak bo'lmasa, baza foydalanuvchisiga bu huquqni bermang. Unga faqat SELECT, INSERT, UPDATE, DELETE kabi zaruriy huquqlarni bering.

4. Kiruvchi ma'lumotlarni tekshirish (Validatsiya)

Bu qo'shimcha himoya qatlami hisoblanadi. Foydalanuvchidan kelayotgan ma'lumotning turini tekshiring. Masalan, agar ID raqam bo'lishi kerak bo'lsa, uning haqiqatan ham raqam ekanligiga ishonch hosil qiling.

PHP misoli:

$user_id = $_GET['id'];
if (filter_var($user_id, FILTER_VALIDATE_INT)) {
    // ID haqiqatan ham butun son, endi so'rovni bajarsa bo'ladi
} else {
    // Xatolik!
}

Xulosa

SQL Injection — bu jiddiy xavf, lekin undan saqlanish mumkin. Esda tuting:

Hech qachon foydalanuvchi kiritgan ma'lumotni to'g'ridan-to'g'ri SQL so'roviga qo'shib yubormang!

Har doim parametrlangan so'rovlar (prepared statements) yoki zamonaviy freymvorklarning ORM'laridan foydalaning. Bu sizning ilovangizni va foydalanuvchilaringiz ma'lumotlarini xavfsiz saqlashning eng ishonchli usulidir. Xavfsizlik — bu bir martalik ish emas, balki doimiy jarayondir!

SamDevX Assalomu alaykum, KnowHub.uz'ga xush kelibsiz! Mening ismim Samandar. Texnologiyalar – mening ishtiyoqim. Bolaligimdan kompyuterlarga, yoshligimdan kod yozishga qiziqib kelaman. Bu yillar davomida dasturlashni o'rganish jarayonida ko'p qiyinchiliklarga duch keldim: ma'lumotlar tarqoq, o'zbek tilidagi manbalar esa deyarli yo'q edi. KnowHub.uz aynan shu tajribadan kelib chiqib tug'ilgan g'oya. Maqsadim – o'zim o'rgangan bilim va tajribalarni siz bilan bo'lishish, dasturlash va texnologiyalar olamiga endi kirib kelayotganlarga yo'l ko'rsatish va bu sohadagi barcha qiziquvchilarni bir joyga to'plash. Bu saytda men siz bilan go'yoki bir piyola qahva ustida suhbatlashgandek, murakkab narsalarni oddiy tilda tushuntirishga harakat qilaman. Biz bu yerda: Dunyodagi eng qiziqarli texno-yangiliklarni muhokama qilamiz; Kod yozishni amaliy misollarda o'rganamiz; Open Source'ning sirli olamiga sho'ng'iymiz. Profil rasmimdagi logotip bu saytga bo'lgan jiddiy niyatim va uning ortidagi g'oyani ifodalaydi. Umid qilamanki, bu maskan siz uchun ham foydali va qiziqarli bo'ladi. Keling, birgalikda o'rganamiz va o'sishamiz! Savollaringiz bo'lsa, tortinmang! Men bilan bemalol bog'laning.