أمان PHP: حماية موقعك من SQL Injection و XSS

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

كود PHP الخاص بك تحت المجهر: لماذا الصمت ليس ذهباً

\n\n

تخيل: لقد أطلقت موقعك، كل شيء يعمل كالساعة، والعملاء سعداء. وفي هذه الأثناء، في زاوية مظلمة من الإنترنت، يقوم أحد المخترقين المبتدئين بإدخال سطر سحري في نموذج البحث الخاص بك: ' OR 1=1 --. وقاعدة البيانات، وكأنها خادم مطيع، تسلمه جميع كلمات مرور المستخدمين. قصة مألوفة؟ للأسف، بالنسبة للعديد من المطورين المبتدئين، نعم.

\n\n

الأمان في PHP ليس بيروقراطية مملة، بل هو حماية حقيقية لوقتك وأموالك وسمعتك. اليوم سنتعرف على العدوين الرئيسيين لتطبيقات الويب: حقن SQL (SQL Injection) و البرمجة النصية عبر المواقع (XSS). ستتعلم كيفية التعرف عليهما، وتحييدهما، وعدم السماح بهما في كودك مرة أخرى.

\n\n

حقن SQL: عندما يصبح المستخدم مخترقاً

\n\n

حقن SQL هو هجوم يقوم فيه المهاجم "بحقن" كود SQL ضار عبر حقول الإدخال. إذا كنت تقوم بإدخال بيانات المستخدم مباشرة في الاستعلام، فاعتبر أنك فتحت الباب للسارق بنفسك.

\n\n

كيف يبدو الكود الضعيف

\n\n

هذا مثال كلاسيكي لا يزال موجوداً في الكتب القديمة والمواقع الحية:

\n\n
<?php\n// خطير! لا تفعل هذا أبداً\n$username = $_POST['username'];\n$password = $_POST['password'];\n\n$query = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";\n$result = mysqli_query($conn, $query);\n?>
\n\n

ماذا سيحدث إذا تم إدخال admin' -- في حقل اسم المستخدم؟ سيتحول الاستعلام إلى:

\n\n
SELECT * FROM users WHERE username = 'admin' --' AND password = ''
\n\n

الشرطتان -- تعلقان بقية الاستعلام. وفويلا! المخترق يدخل كمسؤول بدون كلمة مرور. وماذا لو أدخل '; DROP TABLE users; --؟ وداعاً أيها المستخدمون.

\n\n

طوق النجاة: الاستعلامات المحضرة (Prepared Statements)

\n\n

أفضل طريقة للحماية من حقن SQL هي استخدام الاستعلامات المحضرة (Prepared Statements) عبر PDO أو MySQLi. هذه الطريقة تفصل منطق الاستعلام عن البيانات، وبالتالي لن يتم تنفيذ أي كود ضار أبداً.

\n\n

إليك كيف يبدو الكود الآمن باستخدام PDO:

\n\n
<?php\n// آمن! نستخدم الاستعلامات المحضرة\n$username = $_POST['username'];\n$password = $_POST['password'];\n\n$stmt = $pdo->prepare("SELECT * FROM users WHERE username = :username AND password = :password");\n$stmt->execute(['username' => $username, 'password' => $password]);\n$user = $stmt->fetch();\n?>
\n\n

الآن حتى لو قام المخترق بإرسال admin' OR 1=1 --، فإن PDO سيتعامل معها كسلسلة نصية عادية، وليس كجزء من أمر SQL. ستقول قاعدة البيانات: "نبحث عن مستخدم بهذا الاسم الغريب". ولن تجد شيئاً.

\n\n

لماذا PDO وليس mysql_*؟

\n\n
    \n
  • الأمان الافتراضي: PDO يقوم تلقائياً بتأمين البيانات (escaping).
  • \n
  • المرونة: يدعم أنظمة قواعد بيانات مختلفة (MySQL, PostgreSQL, SQLite).
  • \n
  • العناصر النائبة المسماة: الكود يصبح مقروءاً وقابلاً للصيانة.
  • \n
  • النهج الكائني: أسلوب برمجة حديث.
  • \n
\n\n

تمت إزالة دوال mysql_* من PHP 7.0، وهذا للأفضل. إذا كنت لا تزال تستخدم mysqli_real_escape_string، فهذا أفضل من لا شيء، لكن PDO لا يزال أكثر أماناً.

\n\n

هجمات XSS: عندما يختبئ الكود في التعليقات

\n\n

البرمجة النصية عبر المواقع (XSS) هي إدخال كود JavaScript إلى الصفحة عبر إدخال المستخدم. تخيل: مستخدم يترك تعليقاً، وبدلاً من النص يكتب:

\n\n
<script>alert('موقعك مخترق!');</script>
\n\n

إذا قمت بعرض هذا دون معالجة، سيرى كل زائر نافذة منبثقة. وماذا لو كان بدلاً من alert كود يسرق ملفات تعريف الارتباط (cookies) أو يعيد التوجيه إلى موقع تصيد؟

\n\n

أنواع هجمات XSS

\n\n
    \n
  • الانعكاسي (Reflected): يتم إدخال الكود الضار في الطلب (مثل رابط) وينعكس مباشرة في الاستجابة.
  • \n
  • المخزن (Stored): يتم تخزين الكود الضار في قاعدة البيانات (مثل التعليقات) ويتم عرضه لكل زائر.
  • \n
  • القائم على DOM (DOM-based): يحدث الهجوم بالكامل في متصفح المستخدم من خلال معالجة كود JavaScript للصفحة.
  • \n
\n\n

الدرع الواقي: تنقية المخرجات

\n\n

القاعدة الذهبية: لا تثق أبداً في إدخال المستخدم. استخدم الدالة htmlspecialchars() لتحويل الأحرف الخاصة إلى كيانات HTML:

\n\n
<?php\n// آمن! نستخدم htmlspecialchars لعرض البيانات\n$comment = $_POST['comment'];\necho htmlspecialchars($comment, ENT_QUOTES, 'UTF-8');\n?>
\n\n

هذا يحول <script> إلى &lt;script&gt;، مما يمنع تنفيذ الكود ويعرضه كنص عادي.

\n\n

سياسة أمان المحتوى (CSP): خط الدفاع الإضافي

\n\n

بالإضافة إلى تنقية المخرجات، استخدم رأس HTTP Content-Security-Policy. هذا يخبر المتصفح بالمصادر المسموح لها بتنفيذ البرامج النصية. حتى إذا تمكن المخترق من حقن كود، فإن المتصفح سيمنع تنفيذه.

\n\n
// مثال على سياسة CSP صارمة\nheader("Content-Security-Policy: default-src 'self'; script-src 'self'");
\n\n

الخلاصة: ممارسات الأمان الأساسية في PHP

\n\n
    \n
  1. استخدم Prepared Statements دائماً مع PDO أو MySQLi للتعامل مع قواعد البيانات.
  2. \n
  3. نقِ جميع المخرجات باستخدام htmlspecialchars() مع العلم أن الترميز UTF-8 إلزامي.
  4. \n
  5. طبق مبدأ "لا تثق أبداً" على جميع بيانات المستخدم، سواء كانت من نماذج أو روابط أو ملفات.
  6. \n
  7. استخدم CSP كطبقة حماية إضافية ضد XSS.
  8. \n
  9. حدث PHP وإطارات العمل باستمرار للحصول على أحدث تصحيحات الأمان.
  10. \n
  11. لا تعرض أبداً أخطاء SQL للمستخدمين في بيئة الإنتاج.
  12. \n
\n\n

الأمان ليس وجهة، بل رحلة مستمرة. ابدأ بتطبيق هذه الممارسات اليوم، واجعل موقعك حصناً منيعاً ضد الهجمات. تذكر: المخترق يحتاج لثغرة واحدة فقط، أما أنت فتحتاج لحماية كل شيء.

المدونات

توصيات الكتب