حقن SQL والاستعلامات ذات المعاملات
أزيلوا مخاطر الحقن باستخدام العبارات المُعدّة مع PDO دائمًا
حقن SQL والاستعلامات ذات المعاملات درس مجاني في PHP Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في PHP Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة PHP Academy 4 دروس في المجموع.
ما المقصود بحقن SQL؟
يحدث حقن SQL عندما تُضمَّن البيانات التي يزوّد بها المستخدم مباشرةً في استعلام SQL، مما يتيح للمهاجمين التلاعب بالاستعلام للوصول إلى البيانات أو تعديلها أو حذفها.
مثال تقليدي
ضم إدخال المستخدم إلى SQL:
<?php
// VULNERABLE: attacker enters username = "' OR '1'='1"
$sql = "SELECT * FROM users WHERE username = '".$_GET["username"]."'";
// Becomes: SELECT * FROM users WHERE username = '' OR '1'='1'
// Returns ALL users!مثال على استخراج البيانات
يستخدم المهاجم UNION SELECT لتسريب البيانات من جداول أخرى.
// Input: ' UNION SELECT username, password FROM admin_users--
// This appends a second SELECT returning admin credentialsالعبارات المُجهزة هي الحل
باستخدام العبارات المُجهزة، يُثبَّت هيكل الاستعلام قبل تقديم أي بيانات. وتتعامل قاعدة البيانات مع جميع القيم المرتبطة باعتبارها بيانات حرفية، وليس شيفرة SQL مطلقًا.
<?php
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = ?");
$stmt->execute([$_GET["username"]]);
// Safe even if username = "' OR 1=1--"العناصر النائبة المسماة
تكون العناصر النائبة المسماة أوضح، لا سيما عند استخدام معلمات متعددة.
<?php
$stmt = $pdo->prepare(
"SELECT * FROM users WHERE email = :email AND active = :active"
);
$stmt->execute([":email" => $email, ":active" => true]);Eloquent آمن افتراضيًا
يستخدم Laravel Eloquent عبارات PDO المُجهزة داخليًا لجميع عمليات منشئ الاستعلامات القياسية.
<?php
// Safe:
User::where("email", $email)->first();
// UNSAFE: raw query with user input!
DB::select("SELECT * FROM users WHERE email = ".$email);الاستعلامات الخام
عندما تضطر إلى استخدام SQL خام في Laravel، استخدم دائمًا ربط المعلمات.
<?php
// Safe raw query:
$users = DB::select("SELECT * FROM users WHERE email = ?", [$email]);
// Or with named bindings:
$users = DB::select("SELECT * FROM users WHERE email = :email", [":email" => $email]);حقن جملة LIKE
تحتاج جمل LIKE إلى معالجة خاصة، إذ يجب الإفلات يدويًا من أحرف البدل (% و_) قبل ربطها.
<?php
$search = str_replace(["%", "_", "\\"], ["\%", "\_", "\\\\"], $userInput);
$stmt = $pdo->prepare("SELECT * FROM products WHERE name LIKE ?");
$stmt->execute(["%$search%"]);حقن ORDER BY
لا يمكن تحديد أسماء الأعمدة واتجاهات ORDER BY باستخدام المعلمات. تحقّق منها مقابل قائمة سماح.
<?php
$allowedColumns = ["name", "price", "created_at"];
$col = in_array($request->sort, $allowedColumns) ? $request->sort : "name";
$dir = $request->dir === "desc" ? "desc" : "asc";
// Then safely build the query stringالإجراءات المخزنة
قد تكون الإجراءات المخزنة عرضةً للثغرات أيضًا إذا ضمّت المدخلات داخليًا. استخدم دائمًا استدعاءات ذات معلمات.
مبدأ أقل قدر من الصلاحيات
يجب ألا يمتلك مستخدم قاعدة البيانات الذي يتصل من PHP سوى صلاحيات SELECT/INSERT/UPDATE/DELETE على الجداول اللازمة، ولا ينبغي أن يمتلك مطلقًا صلاحيات CREATE أو DROP أو صلاحيات المسؤول.
الملخص
استخدم دائمًا العبارات المُجهزة مع المعلمات المرتبطة. لا تضمّن مدخلات المستخدم في SQL مباشرةً مطلقًا. تحقّق من ORDER BY وأسماء الأعمدة مقابل قائمة سماح. استخدم PDO مع تعطيل التجهيز المحاكى.
تحقق سريع
ما الطريقة الصحيحة للحماية من حقن SQL؟
الأسئلة الشائعة
هل درس «حقن SQL والاستعلامات ذات المعاملات» مجاني؟
نعم — نص درس «حقن SQL والاستعلامات ذات المعاملات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة PHP Academy، انتقل إلى CoddyKit PRO. تتضمن دورة PHP Academy 4 دروس في المجموع.
ماذا ستتعلم في «حقن SQL والاستعلامات ذات المعاملات»؟
أزيلوا مخاطر الحقن باستخدام العبارات المُعدّة مع PDO دائمًا تتمرن على PHP Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ PHP Academy؟
لا تُشترط خبرة سابقة. PHP Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «حقن SQL والاستعلامات ذات المعاملات»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس PHP Academy هذا؟
نعم. كل درس في PHP Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- منع البرمجة النصية عبر المواقع (XSS)
- حقن SQL والاستعلامات ذات المعاملات
- الحماية من CSRF
- تخزين كلمات المرور بأمان