php-prepare

Hazırlanan ifadeler, SQL enjeksiyonlarına karşı çok kullanışlıdır.

Hazırlanan bir deyim, aynı (veya benzer) SQL deyimlerini yüksek verimlilikle art arda çalıştırmak için kullanılan bir özelliktir.

Hazırlanan ifadeler temel olarak şu şekilde çalışır:

Prepare: Bir SQL deyimi şablonu oluşturulur ve veritabanına gönderilir. Belirli değerler belirsiz bırakılır, parametreler olarak adlandırılır ("?" Etiketli). Örnek: MyGuests DEĞERLERİNİ TAKİP EDİN (?,?,?)

Veritabanı, SQL deyim şablonu üzerinde sorgu optimizasyonunu ayrıştırır, derler ve gerçekleştirir ve sonucu yürütmeden depolar.

Execute: Daha sonra, uygulama değerleri parametrelere bağlar ve veritabanı deyimi yürütür. Uygulama, ifadeyi farklı değerler ile istediği kadar çalıştırabilir

Doğrudan SQL deyimlerini yürütmekle karşılaştırıldığında, hazırlanan ifadelerin üç ana avantajı vardır:



Hazırlanan ifadeler, sorgudaki hazırlık yalnızca bir kez yapıldığında ayrıştırma süresini azaltır (ifadenin birden çok kez çalıştırılmasına rağmen)

Bağlanan parametreler, sunucuya bant genişliğini en aza indirir, çünkü yalnızca sorguyu her seferinde göndermez ve tüm sorguyu değil

Hazırlanan ifadeler, SQL enjeksiyonlarına karşı çok kullanışlıdır, çünkü daha sonra farklı bir protokol kullanılarak iletilen parametre değerlerinin doğru şekilde kaçması gerekmez. Özgün deyim şablonu harici girdiden türemediyse, SQL enjeksiyonu yapılamaz.



Aşağıdaki örnek, MySQLi'de hazırlanmış ifadeleri ve ilişkili parametreleri kullanır:

< ?php

$servername = "localhost";

$username = "username";

$password = "password";

$dbname = "myDB";

// Bağlantı oluştur

$conn = new mysqli($servername, $username, $password, $dbname);

// Bağlantıyı kontrol et

if ($conn->connect_error) {

die("Connection failed: " . $conn->connect_error);

}

// hazırlamak ve bağlamak

$stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email) VALUES (?, ?, ?)");

$stmt->bind_param("sss", $firstname, $lastname, $email);

// parametreleri ayarla ve çalıştır

$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 "Yeni kayıtlar başarıyla oluşturuldu ";

$stmt->close();

$conn->close();

?>


Yukarıdaki örnekten açıklanacak kod satırları:

"INSERT INTO MyGuests (firstname, lastname, email) VALUES (?, ?, ?)"

Bizim SQL'de bir tamsayı, dize, çift veya blob değerinde yer almak istediğimiz bir soru işareti (?) Ekliyoruz.

Ardından, bind_param () işlevine bir göz atın:

$stmt->bind_param("sss", $firstname, $lastname, $email);

Bu işlev parametreleri SQL sorgusuna bağlar ve veritabanına parametrelerin neler olduğunu söyler. "Sss" argümanı, parametrelerin olduğu veri tiplerini listeler. Karakter, mysql parametresinin bir dize olduğunu söyler.

Tartışma dört türden biri olabilir:

i - tamsayı

d - çift

s - dizi

b - BLOB

Her parametre için bunlardan birine sahip olmalıyız.

Mysql'e hangi veri tipinin beklendiğini söyleyerek, SQL enjeksiyon riskini en aza indiririz.

Not: Harici kaynaklardan (kullanıcı girişi gibi) veri eklemek istiyorsak, verilerin dezenfekte edilmesi ve onaylanması çok önemlidir.



PDO'da hazırlanan ifadeler

< ?php

$servername = "localhost";

$username = "username";

$password = "password";

$dbname = "myDBPDO";

try {

$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);

// PDO hata modunu istisna olarak ayarla

$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

// sql ve bind parametrelerini hazırlar

$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);

// satır eklemek

$firstname = "John";

$lastname = "Doe";

$email = "john@example.com";

$stmt->execute();

// başka bir satır ekle

$firstname = "Mary";

$lastname = "Moe";

$email = "mary@example.com";

$stmt->execute();

// başka bir satır ekle

$firstname = "Julie";

$lastname = "Dooley";

$email = "julie@example.com";

$stmt->execute();

echo "Yeni kayıtlar başarıyla oluşturuldu";

}

catch(PDOException $e)

{

echo "Error: " . $e->getMessage();

}

$conn = null;

?>



Önemli : Veri Eklerken veya Güncellerken Her hangibi Bir Veri Girişi Varsa Muklaka prepare() Kullanım.