PHP Hazırlanan Deyimler PHP Hazırlanan Deyimler

Gönderen: Kaan   Tarih: 2018-10-11 12:44 Kategori: php5egitim | Okundu: 183

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

Hazırlanmış İfadeler ve Bağlı Parametreler

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:

  1. Hazırla: 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 (?,?,?)
  2. Veritabanı, SQL deyim şablonu üzerinde sorgu optimizasyonunu ayrıştırır, derler ve gerçekleştirir ve sonucu yürütmeden depolar.
  3. Yürüt: 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ığı için ayrıştırma süresini kısaltı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.

 

MySQLi'de hazırlanan ifadeler

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

Örnek (Hazırlanmış Deyimlerle MySQLi)

<?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 = "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";

$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:

  • ben - 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

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

Örnek (Hazırlanmış İfadeler ile PDO)

<?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 = "john@example.com";
    $stmt->execute();

    // insert another row
    $firstname = "Mary";
    $lastname = "Moe";
    $email = "mary@example.com";
    $stmt->execute();

    // insert another row
    $firstname = "Julie";
    $lastname = "Dooley";
    $email = "julie@example.com";
    $stmt->execute();

    echo "New records created successfully";
    }
catch(PDOException $e)
    {
    echo "Error: " . $e->getMessage();
    }
$conn = null;
?>

 



Yorumlar: (0)

Henüz yorum yapılmamıştır.

Yorum:

CAPTCHA

Reklamlar

FACEBOOK'DA TAKİP ET

BUNLAR İLGİNİZİ ÇEKEBİLİR

Reklam