Muammo ildizi
SQL matnini foydalanuvchi satri bilan birlashtirish ma’lumotni query sintaksisiga aylantirishi mumkin. Qora ro‘yxatdagi belgilarni olib tashlash umumiy himoya emas. Parametrli query SQL tuzilmasi va qiymatlarni ajratadi.
To‘g‘ri misol
SQLite’da WHERE name = ? va alohida tuple ishlatiladi. Django ORM odatiy filterlarda qiymatlarni parametr qiladi. Jadval yoki ustun nomini parametr o‘rniga berib bo‘lmaydi; ular oldindan belgilangan allowlist orqali tanlanadi. Raw SQL uchun ham ayni qoida amal qiladi.
Xavfsiz sinov
Dars faqat xotiradagi, sintetik SQLite bazasini yaratadi. Maxsus apostrofli ism ham oddiy ma’lumot bo‘lib qolishini tekshiring. Bazaga minimal huquq bering, xatoda query yoki ulanish sirlarini foydalanuvchiga chiqarmang. Input validatsiya parametrli query’ga qo‘shimcha qatlam, uning o‘rnini bosmaydi.
Python’da ko‘rib chiqamiz
import sqlite3
db = sqlite3.connect(":memory:")
db.execute("CREATE TABLE users (name TEXT)")
db.executemany("INSERT INTO users VALUES (?)", [("ali",), ("vali",)])
query = "ali"
rows = db.execute("SELECT name FROM users WHERE name = ?", (query,)).fetchall()
print(len(rows))
db.close()Misolni
Mustaqil mashq
Sintetik bazaga apostrofli ism kiriting va aynan shu ismni parametr bilan toping. Query satrini birlashtirmang. Mavjud bo‘lmagan ism 0 natija berishini tekshiring.