Hazırlanan deyimleri SQL enjeksiyon karşı çok faydalıdır.
Hazırlanan Tablolar ve Bağlı Parametreler
Bir hazır deyimi aynı yürütmek için kullanılan bir özelliktir (or similar) yüksek verimle defalarca SQL ifadelerini.
Hazırlanan tablolar temelde bu gibi çalışır:
- Hazırlayın: Bir SQL deyimi şablon oluşturulur ve veritabanına gönderilir. Bazı değerler parametreler denilen, belirtilmemiş kalır (labeled "?") . Örnek: MyGuests INSERT INTO VALUES(?, ?, ?)
- veritabanı, ayrıştırır derler ve SQL deyimi şablona sorgu optimizasyonunu gerçekleştirir ve bunu yürütme olmadan sonucunu saklar
- Yürütme: Daha sonraki bir zamanda, uygulama parametrelerine değerleri bağlar ve veritabanı deyimini yürütür. farklı değerlerle istediği gibi uygulama deyimi olarak defalarca yürütebilir
doğrudan SQL ifadeleri yürütme ile karşılaştırıldığında, hazır deyimler iki ana avantajları vardır:
- Hazırlanan tablolar sorguya hazırlık sadece bir kez yapıldığı gibi ayrıştırma zamanı azaltır (although the statement is executed multiple times)
- Bağlı parametreler sadece parametreleri her zaman göndermek gerektiğinden sunucuya bant genişliğini en aza indirmek ve tamamı değil sorgu
- Daha sonra farklı bir protokol kullanılarak iletilir parametre değerleri, doğru kaçan gerekmez çünkü Hazırlanan tabloları SQL enjeksiyonu karşı çok faydalıdır. Orijinal deyim şablon harici girişten türetilmiş değilse, SQL yerleştirme gerçekleşemez.
MySQLi Hazırlanmış Tablolar
Aşağıdaki örnek hazırlanmış deyimleri ve mysqli içerisinde bağlı parametreleri kullanır:
Örnek (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();
?>
Kod satırları yukarıdaki örnekten açıklamak:
"INSERT INTO MyGuests (firstname, lastname, email) VALUES (?, ?, ?)"
Bizim SQL, biz bir soru işareti eklemek (?) Biz bir tamsayı, dize, çift ya da blob değerindeki yerine istiyoruz.
Sonra, bir göz bind_param() fonksiyonu:
$stmt->bind_param("sss", $firstname, $lastname, $email);
Bu fonksiyon, SQL sorgusuna parametreleri bağlar ve parametreler nelerdir veritabanını söyler. "sss" argümanı parametrelerdir veri türlerini listeler. s karakter parametresi bir dize olduğunu mysql söyler.
argüman dört tip biri olabilir:
- I - tamsayı
- d - çift
- s - dize
- b - BLOB
Her parametre için bunlardan birine sahip olması gerekir.
beklemek ne tür verileri mysql söylüyorum, biz SQL enjeksiyonu riskini en aza indirmek.
Not: Harici kaynaklardan herhangi bir veri eklemek istiyorsanız (like user input) , veri sterilize ve doğrulanır çok önemlidir.
PDO'daki Hazırlanan Tablolar
Aşağıdaki örnek hazırlanmış deyimleri ve PDO'daki bağlı parametreleri kullanır:
Örnek (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;
?>