Bosh sahifa Wiki Prepared statement

Prepared statement

Prepared statement — SQL buyruq tuzilmasini foydalanuvchi qiymatlaridan ajratib, parametrlar bilan bajarishga imkon beruvchi ma’lumotlar bazasi interfeysi. Database SQL matnini parse qiladi, placeholderlarni qiymat joylari sifatida taniydi va keyin parametrlarni data sifatida bog‘laydi. Shu sababli parametr ichidagi qo‘shtirnoq yoki SQL kalit so‘zi so‘rov sintaksisini o‘zgartirmaydi. Prepared statement SQL injectionga qarshi asosiy nazoratdir.

Parametrlarni bog‘lash

Placeholder sintaksisi driver va databasega qarab farq qiladi: ?, $1, :name yoki %s ishlatilishi mumkin. Quyidagi mantiqiy misolda qiymat SQL satriga qo‘shilmaydi:

SELECT id, title
FROM articles
WHERE author_id = $1 AND status = $2;

Driver author_id va statusni alohida protokol maydonida yuboradi. Database parametr turini integer, text yoki boshqa tur sifatida bilishi mumkin. String interpolation bilan ... WHERE name = ' + input + ' qurish esa escapingga bog‘lanadi va injection xavfini qaytaradi.

Prepared statement atamasi server-side oldindan tayyorlangan reja yoki client driverning parameterized query funksiyasini anglatishi mumkin. Ba’zi driverlar protokol darajasida tayyorlamasdan, xavfsiz escaping bilan emulyatsiya qiladi. Xavfsizlik xususiyati API kontraktiga va to‘g‘ri foydalanishga bog‘liq; SQL satrini parametrlar kelishidan oldin ishonchsiz qism bilan qurib bo‘lgach “prepare” qilish foyda bermaydi.

Parametr qilib bo‘lmaydigan qismlar

Parametrlar odatda literal qiymatlar o‘rnida ishlaydi. Jadval nomi, ustun nomi, ASC/DESC yo‘nalishi yoki SQL operatorini placeholder orqali berib bo‘lmaydi. Bunday dinamik qismlar foydalanuvchi matnidan escape qilib olinmaydi, balki dasturdagi allowlistdan aniq tanlanadi:

sort = {"new": "created_at DESC", "title": "title ASC"}[user_choice]

IN ro‘yxatida har element uchun alohida placeholder yaratiladi yoki driver array parametrini qo‘llaydi. Bitta vergulli satrni bitta placeholderga berish uni SQL ro‘yxatiga aylantirmaydi. Limit va offset ham driver qo‘llasa integer parametr sifatida bog‘lanadi, aks holda qat’iy parse va chegaradan o‘tadi.

Stored procedure va ORM

Stored procedure avtomatik ravishda injectiondan xoli emas. Uning ichida dynamic SQL satr birlashtirish bilan qurilsa, xuddi shu xavf mavjud. Procedure parametrlarini data sifatida bog‘lash va dinamik identifikatorlarni allowlist qilish kerak. Yuqori imtiyoz bilan ishlaydigan procedure injection ta’sirini yanada oshirishi mumkin.

ORM odatda filter qiymatlarini parametr qiladi, lekin raw query, extra, dinamik order yoki maxsus expression APIlari xavfsizlik chegarasini o‘zgartiradi. Query logida SQL va parametrlar alohida ko‘rsatilishi mumkin; production log maxfiy qiymatlarni oshkor qilmasligi kerak. ORM nomidan qat’i nazar, yakuniy database ruxsati least privilege bo‘yicha cheklanadi.

Reja va unumdorlik

Prepared statement parse va plan xarajatini qayta ishlatishi mumkin. Biroq parametr qiymatlari taqsimoti turlicha bo‘lsa, umumiy cached plan ayrim so‘rovlar uchun optimal bo‘lmasligi mumkin. Database custom va generic plan siyosatiga ega. Bu performance masalasi parameterizationni bekor qilib SQL injection xavfini qabul qilishga sabab bo‘lmaydi.

Statement connection yoki sessionga bog‘langan bo‘lishi mumkin. Connection pool boshqa connectionga o‘tganda tayyorlangan nom mavjud bo‘lmasligi ehtimoli bor. Driver lifecycle’ni boshqaradi yoki unnamed statement ishlatadi. Schema o‘zgarishi cached planni invalidatsiya qiladi va qayta tayyorlash talab etilishi mumkin.

Prepared statement query qiymatini xavfsiz ajratadi, lekin natijani HTMLga chiqarishda XSSdan himoya qilmaydi. Database’dan olingan matn ham chiqish kontekstida escape qilinadi. Xavfsizlik nazoratining bu ajratilishi “bazadan keldi, demak ishonchli” degan noto‘g‘ri taxminni oldini oladi.

Bog‘liq tushunchalar

SQL injection, Parameterized query, Database driver, Query plan, ORM, Allowlist, Least privilege