شرح صفوف ومحتوى الفقرة
تقضي الاستعلامات المحضرة (Prepared Statements) على ثغرة حقن SQL بنسبة 100% لأنها تنفذ الاستعلام عبر مرحلتين منفصلتين تماماً في بروتوكول قاعدة البيانات:
- المرحلة الأولى —
$pdo->prepare($sql): يرسل PHP قالب الاستعلام وبداخله رموز نائبة (Placeholders مثل:emailأو?) إلى خادم قاعدة البيانات ليقوم بتحليل هيكل الأمر وتثبيته أولاً. - المرحلة الثانية —
$stmt->execute($params): تُرسل القيم الفعلية في حزمة منفصلة؛ وبما أن شجرة الأمر قد تُرجمت مسبقاً، يستحيل أن تتحول البيانات المرسلة إلى أوامر تنفيذية.
PHP
<?php
$pdo = new PDO("sqlite::memory:");
$pdo->exec("CREATE TABLE subscribers (email TEXT)");
// Step 1: Prepare template (returns PDOStatement)
$stmt = $pdo->prepare("INSERT INTO subscribers (email) VALUES (:email)");
// Step 2: Execute with bound data
$stmt->execute(["email" => "[email protected]"]);
echo "Subscriber saved safely.";