أمان تطبيقات PHP: أهم 10 ثغرات وطرق الحماية
تظل PHP واحدة من أكثر اللغات شيوعًا لتطوير الويب، لكن مرونتها غالبًا ما تؤدي إلى ثغرات. وفقًا لتقارير الأمان، أكثر من 70% من تطبيقات الويب تحتوي على ثغرة خطيرة واحدة على الأقل. في هذه المقالة، سنستعرض أهم 10 ثغرات PHP الأكثر خطورة، ونقدم أمثلة حقيقية على الكود، ونوضح كيفية حماية تطبيقك بفعالية.
1. حقن SQL (SQL Injection)
أكثر الثغرات شيوعًا وخطورة. يمكن للمهاجم إدخال كود SQL عشوائي عبر إدخال المستخدم.
الكود الضعيف:
<?php$id = $_GET['id'];$query = "SELECT * FROM users WHERE id = $id";$result = mysqli_query($conn, $query);?>الحماية: استخدام العبارات المحضرة (Prepared Statements):
<?php$stmt = $conn->prepare("SELECT * FROM users WHERE id = ?");$stmt->bind_param("i", $_GET['id']);$stmt->execute();$result = $stmt->get_result();?>2. XSS (Cross-Site Scripting)
إدخال نصوص برمجية ضارة في صفحات الويب. هناك ثلاثة أنواع: المنعكس، المخزن، وDOM-based.
الكود الضعيف:
<?phpecho "مرحبًا، " . $_GET['name'];?>الحماية: ترميز المخرجات:
<?phpecho "مرحبًا، " . htmlspecialchars($_GET['name'], ENT_QUOTES, 'UTF-8');?>3. CSRF (Cross-Site Request Forgery)
هجوم يجبر المهاجم فيه المستخدم على تنفيذ إجراءات غير مرغوب فيها على موقع تم توثيقه فيه.
الحماية: استخدام رموز CSRF:
<?phpsession_start();if (empty($_SESSION['csrf_token'])) { $_SESSION['csrf_token'] = bin2hex(random_bytes(32));}
// التحقق عند إرسال النموذجif ($_POST['csrf_token'] !== $_SESSION['csrf_token']) { die('تم اكتشاف هجوم CSRF!');}?>
<form method="POST"> <input type="hidden" name="csrf_token" value="<?= $_SESSION['csrf_token'] ?>"> <button type="submit">إرسال</button></form>4. Path Traversal (تجاوز المسار)
ثغرة تسمح بقراءة ملفات عشوائية على الخادم.
الكود الضعيف:
<?php$file = $_GET['file'];include("pages/" . $file);?>الحماية: التحقق من الصحة وتقييد المسارات:
<?php$allowed_files = ['about.php', 'contact.php', 'home.php'];$file = basename($_GET['file']);
if (in_array($file, $allowed_files)) { include("pages/" . $file);} else { die('الوصول ممنوع');}?>5. File Upload (رفع الملفات)
رفع الملفات غير الآمن قد يؤدي إلى تنفيذ كود عشوائي على الخادم.
الحماية: التحقق من نوع MIME والامتداد:
<?php$allowed_types = ['image/jpeg', 'image/png', 'image/gif'];$max_size = 5 * 1024 * 1024; // 5 MB
if ($_FILES['file']['size'] > $max_size) { die('الملف كبير جدًا');}
$finfo = finfo_open(FILEINFO_MIME_TYPE);$mime_type = finfo_file($finfo, $_FILES['file']['tmp_name']);
if (!in_array($mime_type, $allowed_types)) { die('نوع الملف غير مسموح به');}
// إعادة تسمية الملف للأمان$extension = pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION);$new_name = md5(uniqid()) . '.' . $extension;move_uploaded_file($_FILES['file']['tmp_name'], 'uploads/' . $new_name);?>6. Session Fixation (تثبيت الجلسة)
هجوم يفرض فيه المهاجم على المستخدم معرف جلسة معروف.
الحماية: إعادة توليد معرف الجلسة:
<?phpsession_start();
// بعد المصادقة الناجحةi