SQL injection va undan himoya

Baza bilan ishlaydigan dasturda so’rovlar ko’pincha foydalanuvchi kiritmasidan quriladi — masalan ism bo’yicha qidiruv. Agar bu noto’g’ri qilinsa, buzg’unchi so’rovni o’zgartirib, butun bazani buzishi mumkin. Bu hujum SQL injection deyiladi. Bu darsda uning mohiyati va himoyasini ko’ramiz.

Muammo: kiritmani to’g’ridan qo’shish

Aytaylik, dastur ism bo’yicha qidiradi va so’rovni satrlarni ulab quradi:

kiritma = input("Ism: ")
so'rov = "SELECT * FROM mijozlar WHERE ism = '" + kiritma + "'"

Oddiy ism (Aziz) uchun ishlaydi. Lekin buzg’unchi shunday yozsa:

'; DROP TABLE mijozlar; --

So’rov quyidagiga aylanadi va mijozlar jadvali o’chib ketadi:

SELECT * FROM mijozlar WHERE ism = ''; DROP TABLE mijozlar; --'

Buzg’unchi OR '1'='1' yozsa, shart har doim rost bo’ladi va so’rov butun jadvalni qaytaradi:

SELECT * FROM mijozlar WHERE ism = '' OR '1'='1';

ism = '' hech kimga to’g’ri kelmaydi, lekin '1'='1' doim rost. OR tufayli har qator shartdan o’tadi — natijada to’rt mijozning hammasi ochiladi:

idismshaharyosh
1AzizToshkent28
2DilnozaSamarqand34
3BoburToshkent22
4MalikaBuxoroNULL

Kiritma kod sifatida bajarildi — mana SQL injection.

SQL · namuna baza

Yechim: parametrli so’rov

Himoya — kiritmani so’rovga ulab yozmaslik, balki uni alohida parametr sifatida uzatish. Kod ichida ? belgisi qo’yiladi, qiymat esa alohida beriladi:

kiritma = input("Ism: ")
cursor.execute(
    "SELECT * FROM mijozlar WHERE ism = ?",
    (kiritma,)
)

Endi baza kiritma ni faqat ma’lumot deb qabul qiladi — ichidagi SQL hech qachon bajarilmaydi. '; DROP TABLE ... yozilsa ham, u shunchaki qidiriladigan matn bo’lib qoladi, kod emas.

Amaliy mashq

Hujumni tushunib, himoyani o’rganing:

  1. Yuqoridagi hujum so’rovini (SELECT * FROM mijozlar WHERE ism = '' OR '1'='1';) matn blokidan qo’lda ko’chirib, sahifadagi runner’ga qo’ying va ishga tushiring;
  2. natijaga qarang — nechta qator qaytdi va nega?
  3. oddiy WHERE ism = 'Aziz' bilan solishtiring — qatorlar soni qancha farq qildi?
  4. OR '1'='1' qismi shartni qanday o’zgartirganini tushuntiring;
  5. qog’ozda yozing: bu so’rov foydalanuvchi kiritmasidan qurilganda dasturchi qanday xato qilgan?
  6. o’sha so’rovni ? parametrli ko’rinishda qayta yozing va kiritma endi nega kod emas, ma’lumot bo’lib qolishini tushuntiring.

Himoya yo’li — parametrlangan so’rov. Nega oddiy qo’shtirnoq yetarli emas?

Qisqacha xulosa

  • SQL injection — kiritma orqali so’rovga begona SQL qo’shish hujumi.
  • Sabab: kiritma kod sifatida talqin qilinishi.
  • Xavf: ma’lumotni o’g’irlash, o’zgartirish yoki butun jadvalni o’chirish.
  • Himoya: parametrli so’rov (? bilan) — kiritma faqat ma’lumot bo’ladi.
  • Kiritmani hech qachon so’rovga to’g’ridan-to’g’ri ulamang.

Keyingi darsda ER-model va baza dizayni — bazani qurishdan oldin uni to’g’ri rejalashtirishni ko’ramiz.

Bu dars foydali bo'ldimi?

—
— marta ko'rildi