أمان تطبيقات PHP: أهم 10 ثغرات أمنية عمليًا
لا يزال PHP أحد أكثر اللغات شيوعًا لتطوير الويب، لكن مرونته غالبًا ما تؤدي إلى مشاكل أمنية خطيرة. وفقًا لـ OWASP، ترتبط 80% من الهجمات على تطبيقات الويب بثغرات يمكن منعها في مرحلة كتابة الكود. في هذه المقالة، سنستعرض 10 من أكثر الثغرات شيوعًا في تطبيقات PHP مع أمثلة كود حقيقية وطرق الحماية. ستكون المادة مفيدة للمطورين المبتدئين وذوي الخبرة على حد سواء.
1. حقن SQL (SQL Injection)
أخطر وأكثر الثغرات شيوعًا. يقوم المهاجم بإدخال كود SQL عبر حقول الإدخال، مما يمنحه الوصول إلى قاعدة البيانات.
الكود الضعيف:
$username = $_POST['username'];$query = "SELECT * FROM users WHERE username = '$username'";الهجوم: إدخال ' OR '1'='1 يحول الاستعلام إلى SELECT * FROM users WHERE username = '' OR '1'='1'، مما يعيد جميع المستخدمين.
الحماية: استخدم الاستعلامات المُعدة (prepared statements) مع PDO:
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = :username");$stmt->execute(['username' => $_POST['username']]);2. XSS (Cross-Site Scripting)
يقوم المهاجم بحقن كود JavaScript يتم تنفيذه في متصفح الضحية. هناك ثلاثة أنواع: المنعكس (reflected)، المخزن (stored)، والقائم على DOM (DOM-based).
الكود الضعيف (XSS مخزن):
echo "<div>" . $comment . "</div>";الحماية: قم بتشفير المخرجات باستخدام htmlspecialchars():
echo "<div>" . htmlspecialchars($comment, ENT_QUOTES, 'UTF-8') . "</div>";بالنسبة لمحتوى HTML، استخدم مكتبات مثل HTML Purifier.
3. CSRF (Cross-Site Request Forgery)
هجوم يجبر المستخدم المُصرح له على تنفيذ إجراء غير مرغوب فيه على الموقع، مثل تغيير كلمة المرور أو تحويل الأموال.
الحماية: قم بتطبيق رموز CSRF:
// توليد الرمز$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
// في النموذجecho '<input type="hidden" name="csrf_token" value="' . $_SESSION['csrf_token'] . '">';
// التحققif ($_POST['csrf_token'] !== $_SESSION['csrf_token']) { die('تم اكتشاف هجوم CSRF');}4. Path Traversal (اجتياز الدلائل)
يقوم المهاجم بالتلاعب بمسارات الملفات للوصول إلى ملفات النظام (مثل /etc/passwd إلخ).
الكود الضعيف:
$file = $_GET['file'];include("pages/" . $file);الحماية: استخدم القوائم البيضاء أو دالة basename():
$allowed = ['home', 'about', 'contact'];$file = basename($_GET['file']);if (in_array($file, $allowed)) { include("pages/$file.php");} else { die('ملف غير مسموح به');}5. ثغرات رفع الملفات (File Upload Vulnerabilities)
يقوم المهاجم برفع سكربت PHP بدلاً من صورة، مما يمنحه وصولاً عن بُعد إلى الخادم.
الحماية:
- تحقق من نوع MIME للملف:
$_FILES['file']['type'] - استخدم
finfoلتحديد النوع الحقيقي - امنع تنفيذ السكربتات في مجلد التحميلات عبر
.htaccess - قم بتوليد أسماء ملفات فريدة:
md5(uniqid()) . '.jpg'
$finfo = finfo_open(FILEINFO_MIME_TYPE);$mime = finfo_file($finfo, $_FILES['file']['tmp_name']);$allowed = ['image/jpeg', 'image/png'];if (!in_array($mime, $allowed)) { die('نوع ملف غير مسموح به');}6. تثبيت الجلسة (Session Fixation)
يفرض المهاجم على المستخدم معرف جلسة معروف لاعتراضها بعد تسجيل الدخول.
الحماية: بعد نجاح