Structured Query Language (SQL) maxsus ravishda relational databases ichida saqlanadigan ma'lumotlarni boshqarish va ular bilan o'zaro aloqa qilish uchun ishlab chiqilgan. SQL yordamida ma'lumotlarni so'rash, kiritish, o'zgartirish yoki hatto o'chirish, ba'zi hollarda esa operatsion tizim buyruqlarini bajarish mumkin. SQL instansi juda ko'p administrativ imtiyozlarni taqdim etganligi sababli, tez orada ixtiyoriy SQL so'rovlari qanday qilib katta xavfsizlik xavfini keltirib chiqarishi mumkinligini ko'ramiz.
Zamonaviy veb-ilovalar odatda foydalanuvchiga qaratilgan interfeys atrofida ishlab chiqiladi, bu frontend deb ataladi va odatda HTML, CSS va JavaScript tillarida yozilgan turli kod bloklari yordamida yaratiladi.
Mijoz frontend bilan o'zaro aloqa qilgandan so'ng, u ma'lumotlarni serverda ishlaydigan backend ilova qatlamiga yuboradi. Backend ilovasini yaratish uchun PHP, Java va Python kabi turli tillarda yozilgan bir nechta frameworklardan foydalanish mumkin.
Keyin, backend kodi ma'lumotlar bazasida joylashgan ma'lumotlar bilan turli yo'llar bilan o'zaro aloqa qiladi, masalan, berilgan foydalanuvchi nomi bilan bog'liq parolni olish.
SQL syntax, buyruqlar va funksiyalar qaysi relational database uchun yaratilganiga qarab farq qiladi. MySQL, Microsoft SQL Server, PostgreSQL va Oracle eng mashhur ma'lumotlar bazasi implementatsiyalari bo'lib, biz har bir variantning xususiyatlarini ko'rib chiqamiz.
Misol tariqasida, users jadvalidan ma'lum bir foydalanuvchi yozuvini olish uchun oddiy MySQL so'rovini yarataylik.
Biz SELECT iborasidan foydalanib, ma'lumotlar bazasiga FROM kalit so'zi orqali aniqlangan ma'lum bir joydan barcha (*****) yozuvlarni olishni xohlayotganimizni ko'rsatamiz, bu holda users jadvali. Oxirida, ma'lumotlar bazasini faqat leon foydalanuvchisiga tegishli yozuvlarni filtrlashga yo'naltiramiz.
SELECT * FROM users WHERE user_name='leon'
Ro'yxat 1 - Users jadvalini tahlil qiluvchi SQL so'rovi
Funktsiyalarni avtomatlashtirish uchun veb-ilovalar ko'pincha SQL so'rovlarini o'zlarining manba kodiga joylashtiradilar.
Bu tushunchani quyidagi backend PHP kod qismini ko'rib chiqish orqali yaxshiroq tushunamiz, bu kod foydalanuvchi tomonidan yuborilgan hisob ma'lumotlarini login jarayonida tekshirish uchun javobgardir:
<?php
$uname = $_POST['uname'];
$passwd =$_POST['password'];
**$sql_query = "SELECT * FROM users WHERE user_name= '$uname' AND password='$passwd'";**
$result = mysqli_query($con, $sql_query);
?>
Ro'yxat 2 - PHP Login manba kodiga joylashtirilgan SQL so'rovi
Yuqorida ta'kidlangan – bu foydalanuvchi nomi va unga mos parolni users jadvalidan qidiruvchi yarim tayyorlangan SQL so'rovi bo'lib, ular uname va passwd o'zgaruvchilarida saqlanadi. So'rov satri keyin sql_queryda saqlanadi va mahalliy ma'lumotlar bazasiga qarshi so'rovni amalga oshirish uchun mysqli_query funksiyasi orqali ishlatiladi, bu esa so'rov natijasini $resultda saqlaydi.
<aside> 💡
Iltimos, shuni yodda tutingki, mysqli_query PHP funksiyasidagi i improved (yaxshilangan) degan ma'noni anglatadi va zaiflik bilan aralashmasligi kerak (SQLidagi i injectionni anglatadi).
</aside>
Hozirgacha biz backend PHP kodi va ma'lumotlar bazasi o'rtasidagi juda oddiy o'zaro aloqani tasvirladik. Yuqoridagi kod parchasini ko'rib chiqsak, user_name va password o'zgaruvchilari foydalanuvchi POST so'rovidan olinadi va hech qanday oldindan tekshiruvsiz sql_query satriga to'g'ridan-to'g'ri kiritiladi. Bu shuni anglatadiki, tajovuzkor SQL ma'lumotlar bazasi tomonidan bajarilishidan oldin yakuniy SQL iborasini o'zgartirishi mumkin.
Tajovuzkor user yoki password maydoniga SQL iborasini kiritib, ilovaning mo'ljallangan mantiqini buzishi mumkin.
Misalni ko'rib chiqaylik. Foydalanuvchi leon deb yozsa, SQL serveri "leon" foydalanuvchi nomini qidiradi va natijani qaytaradi. Ma'lumotlar bazasini qidirish uchun SQL serveri SELECT * FROM users WHERE user_name= leon so'rovini ishga tushiradi. Agar foydalanuvchi o'rniga "leon '+!@#$" deb kiritsa, SQL serveri SELECT * FROM users WHERE user_name= leon'+!@#$ so'rovini ishga tushiradi. Bizning kod blokimizda bu maxsus belgilarni tekshiradigan hech narsa yo'q va aynan shu filtr yo'qligi zaiflikni keltirib chiqaradi.