pernyataan siap sangat berguna terhadap injeksi SQL.
Laporan disiapkan dan Parameter Bound
Sebuah pernyataan yang sudah disiapkan adalah fitur yang digunakan untuk mengeksekusi sama (or similar) pernyataan SQL berulang kali dengan efisiensi tinggi.
pernyataan siap pada dasarnya bekerja seperti ini:
- Siapkan: Sebuah pernyataan Template SQL dibuat dan dikirim ke database. Nilai-nilai tertentu yang tersisa tidak ditentukan, disebut parameter (labeled "?") . Contoh: INSERT INTO MyGuests VALUES(?, ?, ?)
- database mem-parsing, mengkompilasi, dan melakukan optimasi query pada pernyataan Template SQL, dan menyimpan hasilnya tanpa dijalankan
- Jalankan: Pada lain waktu, aplikasi mengikat nilai-nilai untuk parameter, dan database mengeksekusi pernyataan itu. Aplikasi ini dapat mengeksekusi pernyataan sebanyak itu ingin dengan nilai yang berbeda
Dibandingkan dengan mengeksekusi pernyataan SQL langsung, pernyataan siap memiliki dua keuntungan utama:
- Pernyataan siap mengurangi waktu parsing sebagai persiapan pada query dilakukan hanya sekali (although the statement is executed multiple times)
- parameter terikat meminimalkan bandwidth untuk server yang Anda butuhkan mengirim hanya parameter setiap kali, dan tidak seluruh permintaan
- pernyataan siap sangat berguna terhadap injeksi SQL, karena nilai-nilai parameter, yang ditularkan kemudian menggunakan protokol yang berbeda, tidak perlu melarikan diri dengan benar. Jika template pernyataan asli tidak berasal dari input eksternal, SQL injection tidak dapat terjadi.
Laporan siap dalam MySQLi
Contoh berikut ini menggunakan pernyataan siap dan parameter terikat di MySQLi:
Contoh (MySQLi with Prepared Statements)
<?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);
}
// prepare and bind
$stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email)
VALUES (?, ?, ?)");
$stmt->bind_param("sss", $firstname, $lastname,
$email);
// set parameters and execute
$firstname = "John";
$lastname
= "Doe";
$email = "[email protected]";
$stmt->execute();
$firstname
= "Mary";
$lastname = "Moe";
$email = "[email protected]";
$stmt->execute();
$firstname = "Julie";
$lastname = "Dooley";
$email = "[email protected]";
$stmt->execute();
echo "New records created successfully";
$stmt->close();
$conn->close();
?>
baris kode untuk menjelaskan dari contoh di atas:
"INSERT INTO MyGuests (firstname, lastname, email) VALUES (?, ?, ?)"
Dalam SQL kita, kita memasukkan tanda tanya (?) Di mana kita ingin mengganti di integer, string, ganda atau gumpalan nilai.
Kemudian, kita lihat di bind_param() fungsi:
$stmt->bind_param("sss", $firstname, $lastname, $email);
Fungsi ini mengikat parameter untuk query SQL dan memberitahu database apa parameter yang. The "sss" argumen daftar jenis data yang parameter yang. S karakter memberitahu mysql bahwa parameter adalah string.
Argumen mungkin salah satu dari empat jenis:
- i - bilangan bulat
- d - ganda
- s - String
- b - blob
Kita harus memiliki salah satu dari ini untuk masing-masing parameter.
Dengan mengatakan mysql apa jenis data yang diharapkan, kami meminimalkan risiko suntikan SQL.
Catatan: Jika kita ingin memasukkan data dari sumber eksternal (like user input) , sangat penting bahwa data yang dibersihkan dan divalidasi.
Laporan siap dalam PDO
Contoh berikut ini menggunakan pernyataan siap dan parameter terikat di PDO:
Contoh (PDO with Prepared Statements)
<?php
$servername = "localhost";
$username = "username";
$password =
"password";
$dbname =
"myDBPDO";
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname",
$username, $password);
// set the PDO error mode to exception
$conn->setAttribute(PDO::ATTR_ERRMODE,
PDO::ERRMODE_EXCEPTION);
// prepare sql and bind
parameters
$stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email)
VALUES (:firstname, :lastname, :email)");
$stmt->bindParam(':firstname', $firstname);
$stmt->bindParam(':lastname',
$lastname);
$stmt->bindParam(':email', $email);
// insert a row
$firstname =
"John";
$lastname = "Doe";
$email = "[email protected]";
$stmt->execute();
// insert another row
$firstname = "Mary";
$lastname = "Moe";
$email = "[email protected]";
$stmt->execute();
// insert another row
$firstname = "Julie";
$lastname = "Dooley";
$email = "[email protected]";
$stmt->execute();
echo "New records created successfully";
}
catch(PDOException $e)
{
echo "Error: " . $e->getMessage();
}
$conn = null;
?>