مقدمة: لماذا يعتبر PHP خادعًا للمبتدئين؟
لا يزال PHP واحدًا من أشهر لغات تطوير الويب، لكن انخفاض حاجز الدخول إليه يؤدي غالبًا إلى تكوين عادات سيئة. المطورون المبتدئون، المستوحون من بساطة الصياغة، غالبًا ما ينسون الأمان والأداء والمعايير الحديثة. في هذه المقالة، سنحلل أهم أخطاء مطوري PHP المبتدئين التي يمكن أن تحول كودك إلى كابوس للصيانة وثغرة للهجمات.
لن نقوم فقط بسرد المشكلات — بل سترى أمثلة على كود PHP مع الأخطاء وإصداراتها المصححة. سيساعدك هذا على تطبيق الممارسات الصحيحة فورًا.
1. تجاهل الأمان: حقن SQL و XSS
الخطأ الأكثر خطورة هو الثقة ببيانات المستخدم. غالبًا ما يقوم المبتدئون بإدخال المتغيرات مباشرة في استعلامات SQL أو عرضها على الصفحة دون تصفية.
الخطأ: الربط في استعلامات SQL
مثال كلاسيكي على الثغرة:
// غير صحيح: ثغرة لحقن SQL$id = $_GET['id'];$query = "SELECT * FROM users WHERE id = $id";$result = mysqli_query($link, $query);يمكن للمهاجم إرسال ?id=1 OR 1=1 والحصول على جميع البيانات من الجدول.
الحل: الاستعلامات المحضرة (PDO)
استخدم PDO أو mysqli مع التعبيرات المحضرة:
// صحيح: PDO مع استعلام محضر$stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id");$stmt->execute(['id' => $_GET['id']]);$result = $stmt->fetchAll();الخطأ: عرض البيانات دون ترميز (XSS)
إذا قمت بعرض بيانات من قاعدة البيانات أو $_GET مباشرة، فإنك تخاطر بهجوم XSS:
// غير صحيح: ثغرة XSSecho "مرحبًا، " . $_GET['name'];الحل: htmlspecialchars
قم دائمًا بترميز المخرجات:
// صحيح: ترميز HTMLecho "مرحبًا، " . htmlspecialchars($_GET['name'], ENT_QUOTES, 'UTF-8');2. استخدام الإنشاءات والدوال القديمة
العديد من الكتب التعليمية التي يبلغ عمرها 10 سنوات تعلم استخدام دوال mysql_* أو الوسوم القصيرة. هذا ليس غير آمن فحسب، بل قد لا يعمل على الاستضافات الحديثة.
الخطأ: دوال mysql_*
// غير صحيح: إضافة قديمة$link = mysql_connect('localhost', 'user', 'pass');mysql_select_db('test', $link);تمت إزالة هذه الإضافة من PHP 7، وسيتوقف الكود عن العمل مع خطأ.
الحل: الانتقال إلى PDO أو MySQLi
// صحيح: PDO - نهج حديث وآمن$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');الخطأ: الوسوم القصيرة <?
// غير صحيح: قد يكون معطلاً في php.ini<? echo "Hello"; ?>الحل: الوسوم الكاملة فقط
// صحيح: استخدم دائمًا <?php<?php echo "Hello"; ?>3. سوء التعامل مع النماذج والبيانات
غالبًا ما ينسى المطورون المبتدئون التحقق مما إذا كان النموذج قد تم إرساله، ويستخدمون $_REQUEST بدلاً من المصفوفات الشاملة الفائقة المحددة.
الخطأ: عدم التحقق من طريقة الإرسال
// غير صحيح: يتم تنفيذ الكود حتى مع طلب GET$name = $_POST['name'];// ... معالجةالحل: التحقق من REQUEST_METHOD
// صحيح: نتحقق من إرسال النموذجif ($_SERVER['REQUEST_METHOD'] === 'POST') { $name = $_POST['name'] ?? ''; // ... التحقق من الصحة والمعالجة}الخطأ: استخدام $_REQUEST
المصفوفة الشاملة الفائقة $_REQUEST تدمج GET, PO