SQL tayyorlangan buyruqlar


baham ko'ring

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:

  1. 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
  2. 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!