Writeup · 2026-04-28 · ~1 daqiqa o‘qiladi · o'rta
SQL injection: qanday ishlaydi va qanday himoyalanish
SQL injection — OWASP ro‘yxatida yillar davomida yuqori o‘rinlarda. Sababi oddiy: uni qilish oson, oqibati esa halokatli — butun ma'lumotlar bazasi o‘g‘irlanishi mumkin.
Hujum qanday ishlaydi#
Zaif kod — foydalanuvchi kiritmasini to‘g‘ridan-to‘g‘ri so‘rovga qo‘shadi:
# XAVFLI — hech qachon bunday qilmang
query = f"SELECT * FROM users WHERE email = '{email}'"
Endi hujumchi email o‘rniga shunday yozadi:
' OR '1'='1
So‘rov quyidagiga aylanadi:
SELECT * FROM users WHERE email = '' OR '1'='1'
'1'='1' har doim rost — natijada barcha foydalanuvchilar qaytadi.
Yanada yomoni: '; DROP TABLE users; -- bilan jadvalni o‘chirish ham mumkin.
To‘g‘ri himoya: parametrlangan so‘rovlar#
Yechim — kiritmani hech qachon so‘rov matniga qo‘shmaslik. Uni alohida parametr sifatida uzatish:
# XAVFSIZ — parametrlangan so‘rov
cursor.execute("SELECT * FROM users WHERE email = %s", [email])
Bu yerda ma'lumotlar bazasi email qiymatini ma'lumot deb biladi, kod deb emas.
Hujumchi nima yozsa ham, u shunchaki qidiriladigan matn bo‘lib qoladi.
ORM ishlatsangiz#
Django ORM yoki SQLAlchemy kabi ORM'lar buni avtomatik qiladi:
User.objects.filter(email=email) # xavfsiz
Lekin ehtiyot bo‘ling — raw() yoki extra() bilan qo‘lda SQL yozsangiz,
parametrlashni o‘zingiz ta'minlashingiz kerak.
Xulosa#
Qoida bitta va sodda: foydalanuvchi kiritmasi hech qachon so‘rov matniga aralashmasin. Parametrlangan so‘rovlar yoki ORM — bu muammoni butunlay yopadi. Bu 25 yildan beri ma'lum, lekin hali ham loyihalarni buzib turibdi.