أهم 10 ثغرات في تطبيقات PHP: كيفية حماية الكود الخاص بك
لا تزال PHP واحدة من أكثر اللغات شيوعًا لتطوير الويب. ومع ذلك، فإن مرونتها وبساطتها تؤدي غالبًا إلى ظهور ثغرات أمنية خطيرة. وفقًا لإحصائيات OWASP، فإن أكثر من 70% من تطبيقات الويب تحتوي على ثغرة أمنية واحدة على الأقل. في هذه المقالة، سنستعرض 10 من أكثر الثغرات شيوعًا في تطبيقات PHP، وسنعرض أمثلة على الكود الخطير ونقدم توصيات عملية للحماية.
1. حقن SQL (SQL Injection)
أشهر وأخطر هجوم. يقوم المهاجم بإدخال كود SQL من خلال إدخال المستخدم.
كود خطير:
<?php$id = $_GET['id'];$query = "SELECT * FROM users WHERE id = $id";$result = mysqli_query($conn, $query);?>كود آمن (استخدام الاستعلامات المحضرة):
<?php$stmt = $conn->prepare("SELECT * FROM users WHERE id = ?");$stmt->bind_param("i", $_GET['id']);$stmt->execute();$result = $stmt->get_result();?>التوصيات:
- استخدم دائمًا التعبيرات المحضرة (PDO أو MySQLi).
- لا تقم أبدًا بدمج بيانات المستخدم في استعلامات SQL.
- تحقق من أنواع البيانات (مثل
is_numeric()للمعرفات).
2. XSS (Cross-Site Scripting)
إدخال كود JavaScript في الصفحة من خلال بيانات غير موثوقة. سرقة ملفات تعريف الارتباط، إعادة التوجيه إلى مواقع التصيد.
كود خطير:
<?phpecho "مرحبًا، " . $_GET['name'];?>كود آمن:
<?phpecho "مرحبًا، " . htmlspecialchars($_GET['name'], ENT_QUOTES, 'UTF-8');?>التوصيات:
- قم بتشفير المخرجات باستخدام
htmlspecialchars(). - قم بتعيين Content-Security-Policy (CSP) في الرؤوس.
- بالنسبة لاستجابات JSON، استخدم
json_encode().
3. CSRF (Cross-Site Request Forgery)
يجبر المهاجم المستخدم المُصرح له على تنفيذ إجراء غير مرغوب فيه (مثل تحويل الأموال).
مثال على نموذج بدون حماية:
<form action="delete.php" method="POST"> <input type="hidden" name="id" value="123"> <input type="submit" value="حذف"></form>كود آمن (مع رمز مميز):
<?phpsession_start();if (empty($_SESSION['token'])) { $_SESSION['token'] = bin2hex(random_bytes(32));}?><form action="delete.php" method="POST"> <input type="hidden" name="token" value="<?= $_SESSION['token'] ?>"> <input type="hidden" name="id" value="123"> <input type="submit" value="حذف"></form>التوصيات:
- قم بإنشاء رموز CSRF فريدة لكل نموذج.
- تحقق من الرموز على الخادم قبل تنفيذ الإجراءات.
- استخدم SameSite Cookie (Lax أو Strict).
4. المصادقة غير الصحيحة وإدارة الجلسات
حماية ضعيفة للجلسات، تسرب المعرفات، تثبيت الجلسة.
كود ضعيف:
<?phpsession_start();if ($_POST['password'] == 'admin123') { $_SESSION['logged'] = true;}?>كود آمن:
<?phpsession_start();session_regenerate_id(true); // تغيير معرف الجلسة بعد تسجيل الدخول
// تجزئة كلمة المرور$hash = password_hash($_POST['password'], PASSWORD_BCRYPT);if (password_verify($input_password, $hash)) { $_SESSION['logged'] = true; $_SESSION['user_agent'] = $_SERVER['HTTP_USER_AGENT'];}?>التوصيات:
- استخدم
password_hash()وpassword_verify()لتجزئة كلمات المرور. - قم بتجديد معرف الجلسة بعد تسجيل الدخول باستخدام
session_regenerate_id(). - تحقق من وكيل المستخدم وعنوان IP للجلسة.