Asosiy kontentga o‘tish

Maqolalar

Writeup · 2026-04-28 · ~1 daqiqa o‘qiladi · o'rta

SQL injection: qanday ishlaydi va qanday himoyalanish

#security #database #backend

Mundarija

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.