SQL tayyorlangan buyruqlar
Tayyorlangan SQL buyruqlari - SQL injeksiyasining oldini olish
SQL tayyorlangan buyruqlari (prepared statements) veb-saytni SQL in’ektsiyalaridan himoya qilish uchun ishlatilishi mumkin.
Tayyorlangan buyruqlar so‘rov strukturasini (SQL) haqiqiy ma’lumotlardan (foydalanuvchi kiritgan ma’lumotlardan) ajratadi.
Tayyorlangan buyruqlar (prepared statements) asosan quyidagicha ishlaydi:
- Tayyorlang: SQL so‘rovi shabloni to‘ldirgichlar bilan serverga yuboriladi. Ma’lumotlar qiymatlari yuborilmaydi. Misol: INSERT INTO MyGuests VALUES(?, ?, ?). Keyin server SQL so‘rovi shablonini bajarmasdan tahlil qiladi, kompilyatsiya qiladi va optimallashtiradi
- Bajarish: Keyinchalik dastur qiymatlarni parametrlarga bog‘laydi va ma’lumotlar bazasi so‘rovni bajaradi. Ilova so‘rovni turli qiymatlar bilan xohlagancha bajarishi mumkin
Tayyorlangan buyruqlarning to‘rtta asosiy afzalligi bor:
- Qisqartirilgan tahlil vaqti - so‘rov bo‘yicha tayyorgarlik faqat bir marta amalga oshiriladi (buyruq bir necha marta bajarilgan bo‘lsa ham)
- o‘tkazish qobiliyatini minimallashtirish - Bog‘langan parametrlar serverga o‘tkazish qobiliyatini minimallashtiradi, chunki har safar butun so‘rovni emas, balki faqat parametrlarni yuborishingiz kerak.
- Xavfsizlik - Tayyorlangan buyruqlar SQL in’yeksiyalariga qarshi juda foydali, chunki keyinroq boshqa protokol orqali uzatiladigan parametr qiymatlarini to‘g‘ri ekranlash shart emas. Agar asl buyruq shabloni tashqi kiritilgan ma’lumotlardan hosil qilinmagan bo‘lsa, SQL in’yeksiyasi sodir bo‘lmaydi.
- Toza kod - ma’lumotlarni SQL buyruqlaridan ajratish hisobiga
MySQL’da tayyorlangan buyruqlar
Quyidagi misol PHP MySQL Prepared Statements bo‘limidan olingan va MySQL’da tayyorlangan buyruqlardan foydalanadi:
Misol - Tayyor buyruqlar bilan MySQL
<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
// SQL query template
$sql = "INSERT INTO MyGuests (firstname, lastname, email) VALUES (?, ?, ?)";
// Prepare the SQL query template
if($stmt = $conn->prepare($sql)) {
// Bind parameters
$stmt->bind_param("sss", $firstname, $lastname, $email);
//
Set parameters and execute
$firstname = "John";
$lastname = "Doe";
$email = "john@example.com";
$stmt->execute();
$firstname = "Mary";
$lastname = "Moe";
$email = "mary@example.com";
$stmt->execute();
$firstname = "Julie";
$lastname = "Dooley";
$email = "julie@example.com";
$stmt->execute();
echo "New records created successfully";
} else {
echo "Error: " . $sql . "<br>" . $conn->error;
}
$stmt->close();
$conn->close();
?>
Kod tushuntirish
IN SQL, savol belgilari (?) FirstName, LastName va elektron pochta qiymatlari uchun joy egalari:
"INSERT INTO MyGuests (firstname, lastname, email) VALUES (?, ?, ?)"
Endi bind_param() funksiyasiga qarang. Bu funksiya o‘zgaruvchilarni SQL so‘rovidagi o‘rinbosarlarga bog‘laydi. O‘rinbosarlar (?) bajarilish vaqtida o‘zgaruvchilardagi haqiqiy qiymatlar bilan almashtiriladi. "sss" argumenti har bir parametrning ma’lumot tipini ko‘rsatadi. s belgisi MySQL’ga parametr string ekanligini bildiradi. Biz HAR BIR parametr uchun shulardan birini belgilashimiz kerak. MySQL’ga qanday tipdagi ma’lumot kutish kerakligini aytib, SQL in’yeksiyasi xavfini kamaytiramiz:
$stmt->bind_param("sss", $firstname, $lastname, $email);
Tur argumenti to‘rt turdan biri bo‘lishi mumkin:
- i - integer (whole number)
- d - double (floating point number)
- s - string (matn)
- b - binary (image, PDF, etc.)
Eslatma: Agar tashqi manbalardan (masalan, foydalanuvchi kiritgan) ma’lumotlarni kiritmoqchi bo‘lsak, ma’lumotlarni tozalash (sanitize) va tekshirish (validate) juda muhim.
W3Schools Pathfinder
Yutuqlaringizni kuzating – bu bepul!
