أمان تطبيقات PHP: أهم 10 ثغرات للمبتدئين
\nلا تزال PHP واحدة من أكثر اللغات شيوعًا لتطوير الويب، لكن مرونتها غالبًا ما تؤدي إلى ثغرات إذا لم يتم اتباع قواعد الأمان الأساسية. وفقًا لـ OWASP، تحدث معظم الاختراقات بسبب 10 أخطاء نموذجية يرتكبها المطورون المبتدئون. في هذه المقالة، سنشرح كل ثغرة بأمثلة كود حقيقية ونوضح كيفية حماية تطبيقك.
\n\n1. حقن SQL (SQL Injection)
\nالهجوم الأكثر شيوعًا. يقوم المهاجم بإدخال كود SQL ضار عبر إدخال المستخدم.
\nالكود الضعيف:
\n<?php\n$id = $_GET['id'];\n$query = "SELECT * FROM users WHERE id = $id";\n$result = mysqli_query($conn, $query);\n?>\nالحماية: استخدم الاستعلامات المحضرة (prepared statements):
\n<?php\n$stmt = $conn->prepare("SELECT * FROM users WHERE id = ?");\n$stmt->bind_param("i", $_GET['id']);\n$stmt->execute();\n$result = $stmt->get_result();\n?>\n\n2. XSS (Cross-Site Scripting)
\nإدخال كود JavaScript في الصفحة عبر بيانات غير موثقة.
\nالكود الضعيف:
\n<?php\necho "مرحبًا، " . $_GET['name'];\n?>\nالحماية: قم بتشفير المخرجات باستخدام htmlspecialchars():
<?php\necho "مرحبًا، " . htmlspecialchars($_GET['name'], ENT_QUOTES, 'UTF-8');\n?>\n\n3. CSRF (Cross-Site Request Forgery)
\nهجوم يقوم فيه المستخدم بتنفيذ إجراءات غير مرغوب فيها باسمه.
\nالكود الضعيف:
\n<form action="/delete.php" method="POST">\n <input type="submit" value="حذف الحساب">\n</form>\nالحماية: أضف رمز CSRF:
\n<?php\nsession_start();\n$_SESSION['csrf_token'] = bin2hex(random_bytes(32));\n?>\n<form action="/delete.php" method="POST">\n <input type="hidden" name="csrf_token" value="<?= $_SESSION['csrf_token'] ?>">\n <input type="submit" value="حذف الحساب">\n</form>\n\n4. تخزين كلمات المرور غير الآمن
\nتخزين كلمات المرور بنص واضح أو باستخدام تجزئات قديمة (MD5، SHA1).
\nالكود الضعيف:
\n<?php\n$password = md5($_POST['password']);\n// أو\n$password = sha1($_POST['password']);\n?>\nالحماية: استخدم password_hash() و password_verify():
<?php\n$hash = password_hash($_POST['password'], PASSWORD_BCRYPT);\n// التحقق:\nif (password_verify($input_password, $hash)) {\n echo "كلمة المرور صحيحة";\n}\n?>\n\n5. العمل غير الآمن مع الملفات (Local/Remote File Inclusion)
\nتضمين الملفات عبر إدخال المستخدم دون تحقق.
\nالكود الضعيف:
\n<?php\ninclude($_GET['page'] . '.php');\n?>\nالحماية: استخدم قائمة بيضاء للملفات المسموح بها:
\n<?php\n$allowed_pages = ['home', 'about', 'contact'];\n$page = $_GET['page'] ?? 'home';\nif (in_array($page, $allowed_pages)) {\n include($page . '.php');\n} else {\n include('404.php');\n}\n?>\n\n6. إعدادات الجلسات غير الصحيحة
\nاستخدام معرفات جلسة قابلة للتوقع أو عدم إعادة التوليد.
\nالكود الضعيف:
\n<?php\nsession_start();\n$_SESSION['user_id'] = $user_id;\n// لا يتم إعادة توليد الجلسة بعد تسجيل الدخول\n?>\nالحماية:
\n<?php\nsession_start();\nsession_regenerate_id(true); // إعادة توليد المعرف بعد تسجيل الدخول\n$_SESSION['user_id'] = $user_id;\n?>\n\n7. التحقق غير الكافي من الإدخال
\nالثقة في أي بيانات من المستخدم.
\nال