كيفية تعقيم إدخال المستخدم في PHP: 7 أخطاء قاتلة وحلولها

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

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

ابدأ الدورة

مقدمة: لماذا يمكن اختراق موقعك على PHP الآن؟

\n

تخيل الموقف: لقد كتبت موقعًا رائعًا على PHP، نموذج اتصال، تعليقات، لوحة تحكم. كل شيء يعمل. ولكن في يوم من الأيام، تدخل إلى لوحة التحكم فتجدها فارغة. أو الأسوأ: يظهر إعلان كازينو على موقعك، ويقوم Google بحظر مصدرك. هل يبدو ذلك مألوفًا؟ أصل الشر هو المعالجة غير الصحيحة لإدخال المستخدم.

\n

سؤال "How can I sanitize user input with PHP?" هو أحد أكثر الأسئلة شيوعًا على Stack Overflow. آلاف المطورين يتعثرون في نفس الأخطاء. في هذا المقال، سنستعرض أهم الأخطاء التي يرتكبها حتى المبرمجون ذوو الخبرة، ونوضح كيفية تجنبها. ستتعلم كيفية الحماية من XSS، حقن SQL، والهجمات الأخرى. هيا بنا!

\n\n

الخطأ رقم 1: استخدام mysql_real_escape_string() لكل شيء

\n

المدرسة القديمة: لا يزال العديد من المطورين يعتقدون أنه إذا قاموا بتغليف جميع البيانات بـ mysql_real_escape_string()، فسيتم حل المشكلة. هذا خطأ فادح. هذه الوظيفة مخصصة فقط لهروب السلاسل في استعلامات SQL، وحتى ذلك الحين، للإضافة القديمة mysql_* التي تمت إزالتها في PHP 7.

\n

مثال على كود خاطئ:

\n
<?php\n$name = mysql_real_escape_string($_POST['name']);\n$query = "INSERT INTO users (name) VALUES ('$name')";\n$result = mysql_query($query);\n?>
\n

لماذا هذا سيء:

\n
    \n
  • الوظيفة لا تحمي من هجمات XSS (مثل إدراج JavaScript).
  • \n
  • الإضافة mysql_* قديمة وغير آمنة.
  • \n
  • أنت تخلط منطق الهروب مع منطق الأعمال.
  • \n
\n

كيفية الإصلاح: استخدم الاستعلامات المعدة (prepared statements) عبر PDO أو MySQLi. ولعرض البيانات على الشاشة، استخدم تعقيمًا منفصلاً.

\n\n

الخطأ رقم 2: تجاهل هجمات XSS عند عرض البيانات

\n

الخطأ الأكثر شيوعًا. لقد استلمت البيانات، وحفظتها في قاعدة البيانات، ثم تقوم بعرضها ببساطة عبر echo أو print. وفجأة، يمكن للمهاجم إدراج سكريبت يسرق ملفات تعريف الارتباط، أو يعيد توجيه المستخدم، أو يفسد التنسيق.

\n

مثال على كود ضعيف:

\n
<?php\necho "<p>مرحبًا، " . $_GET['name'] . "!</p>";\n?>
\n

إذا تم تمرير ?name=<script>alert('XSS')</script> في URL، فسيتم تنفيذ السكريبت.

\n

الحل: استخدم وظيفة htmlspecialchars() مع المعامل ENT_QUOTES:

\n
<?php\n$name = htmlspecialchars($_GET['name'], ENT_QUOTES, 'UTF-8');\necho "<p>مرحبًا، " . $name . "!</p>";\n?>
\n

هام: يجب إجراء التعقيم في لحظة العرض، وليس عند الحفظ. إذا قمت باستبدال الأحرف في قاعدة البيانات، فستفقد البيانات الأصلية.

\n\n

الخطأ رقم 3: التصفية العمياء عبر strip_tags()

\n

يعتقد الكثيرون: "أوه، سأزيل كل وسوم HTML فقط - وسيكون الأمر على ما يرام". لكن strip_tags() ليست حلاً سحريًا. أولاً، تزيل الوسوم فقط، لكنها تترك السمات (مثل onclick). ثانيًا، إذا كنت بحاجة إلى السماح بجزء من الوسوم (مثل <b> أو <i>)، فإن strip_tags() تصبح غير مريحة.

\n

مثال:

\n
<?php\n$comment = strip_tags($_POST['comment']);\necho $comment; // ستزيل <script>، لكنها ستبقي <a onclick="...">\n?>
\n

الحل: استخدم htmlspecialchars() للنص العادي، أو مكتبات مثل HTML Purifier إذا كنت بحاجة إلى السماح بوسوم معينة. HTML Purifier يتحقق ليس فقط من الوسوم، ولكن أيضًا من السمات والأنماط وحتى CSS.

\n\n

الخطأ رقم 4: عدم التحقق من صحة البريد الإلكتروني، URL، والأرقام

\n

التعقيم لا يقتصر فقط على XSS. إذا كنت تتوقع بريدًا إلكترونيًا، وتستقبل سلسلة "123"، فقد يتسبب ذلك في أخطاء. أو إذا قمت بحفظ URL دون تحقق، يمكن للمهاجم إدراج javascript:alert(1).

\n

المدونات

توصيات الكتب