سنقدم في هذا الفصل كيفية استخدام PHP للتحقق من بيانات النموذج المقدم من قبل العميل.
نحن بحاجة إلى النظر في الأمن عند التعامل مع نماذج PHP. سنوضح في هذا الفصل المعالجة الآمنة لبيانات نموذج PHP من أجل منع المتسللين والبريد العشوائي، نحتاج إلى إجراء التحقق من أمان البيانات في النموذج. |
يحتوي نموذج HTML الموصوف في هذا الفصل على حقول الإدخال التالية: حقول النص المطلوبة والاختيارية، وأزرار الاختيار، وأزرار الإرسال:
قواعد التحقق من صحة النموذج أعلاه هي كما يلي:
مجال | قواعد التحقق من الصحة |
---|---|
اسم | يجب. + يمكن أن يحتوي على أحرف ومسافات فقط |
بريد إلكتروني | يجب. + يجب أن يكون عنوان بريد إلكتروني صالحًا (يحتوي على '@' و'.') |
عنوان URL | خياري. إذا كان موجودًا، فيجب أن يحتوي على عنوان URL صالح |
ملاحظة | خياري. حقول الإدخال متعددة الأسطر (حقول نصية) |
جنس | يجب. يجب اختيار واحد |
دعونا أولاً نلقي نظرة على كود نموذج HTML الخالص:
تعتبر حقول "الاسم" و"البريد الإلكتروني" و"موقع الويب" عناصر إدخال نص، أما حقل "الملاحظات" فهو عبارة عن منطقة نصية. يبدو رمز HTML كما يلي:
"الاسم": <input type = "text" name = "name"> البريد الإلكتروني: <input type = "text" name = "email"> موقع الويب: <input type = "text" name = "website"> ملاحظات : <textarea name="comment"rows="5" cols="40"></textarea>
حقل "الجنس" هو زر اختيار ويبدو كود HTML كما يلي:
الجنس: <input type = "radio" name = "gender" value = "أنثى"> أنثى <input type = "radio" name = "gender" value = "ذكر"> ذكر
يبدو رمز نموذج HTML كما يلي:
<formmethod="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
يستخدم النموذج طريقة الطريقة = "post" لإرسال البيانات.
ما هو المتغير $_SERVER["PHP_SELF"]؟ $_SERVER["PHP_SELF"] هو متغير عالمي فائق يُرجع اسم الملف للبرنامج النصي الذي يتم تنفيذه حاليًا ويرتبط بجذر المستند. |
لذلك، سيقوم $_SERVER["PHP_SELF"] بإرسال بيانات النموذج إلى الصفحة الحالية بدلاً من الانتقال إلى صفحة مختلفة.
ما هي طريقة htmlspecialchars()؟ تقوم وظيفة htmlspecialchars() بتحويل بعض الأحرف المحددة مسبقًا إلى كيانات HTML. الأحرف المحددة مسبقًا هي: & (علامة الضم) تصبح & "(علامة الاقتباس المزدوجة) تصبح " ' (علامة الاقتباس المفردة) تصبح ' < (أقل من) يصبح <؛ > (أكبر من) تصبح> |
قد يتم استخدام المتغير $_SERVER["PHP_SELF"] من قبل المتسللين!
عندما يستخدم المتسللون روابط HTTP للبرمجة النصية عبر المواقع للهجوم، سيتم أيضًا تضمين متغير الخادم $_SERVER["PHP_SELF"] في البرنامج النصي. والسبب هو أن البرمجة النصية عبر المواقع يتم إلحاقها بمسار الملف القابل للتنفيذ، وبالتالي فإن السلسلة $_SERVER["PHP_SELF"] ستحتوي على رمز برنامج JavaScript خلف رابط HTTP.
يُطلق على XSS أيضًا اسم CSS (Cross-Site Script)، وهو هجوم البرمجة النصية عبر المواقع. يقوم المهاجمون الضارون بإدخال تعليمات برمجية HTML ضارة في صفحة ويب عندما يتصفح المستخدم الصفحة، سيتم تنفيذ تعليمات HTML البرمجية المضمنة في صفحة الويب، وبالتالي تحقيق الغرض الخاص للمستخدم الخبيث. |
حدد اسم ملف النموذج التالي "test_form.php":
<formmethod="post" action="<?php echo $_SERVER["PHP_SELF"];?>">
الآن، نستخدم عنوان URL لتحديد عنوان التقديم "test_form.php"، ويتم تعديل الكود أعلاه على النحو التالي:
<طريقة النموذج = "post" action = "test_form.php">
سيكون ذلك جيدًا.
ومع ذلك، ضع في اعتبارك أن المستخدم سيقوم بإدخال العنوان التالي في شريط عنوان المتصفح:
http://www.codercto.com/test_form.php/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E
سيتم تحليل عنوان URL أعلاه في الكود التالي وتنفيذه:
<formmethod="post" action="test_form.php/"><script>تنبيه('hacked')</script>
تمت إضافة علامة البرنامج النصي إلى التعليمات البرمجية، وتمت إضافة أمر تنبيه. سيتم تنفيذ كود Javascript هذا عند تحميل الصفحة (سيرى المستخدم مربعًا منبثقًا). هذا مجرد مثال بسيط لكيفية استغلال المتغير PHP_SELF بواسطة المتسللين.
يرجى ملاحظة أنه يمكن إضافة أي كود جافا سكريبت ضمن علامة <script>! يمكن للمتسللين استخدام هذا لإعادة توجيه الصفحة إلى صفحة على خادم آخر. يمكن لملف رمز الصفحة حماية التعليمات البرمجية الضارة أو تعديل المتغيرات العامة أو الحصول على بيانات النموذج الخاصة بالمستخدم.
يمكن تجنب $_SERVER["PHP_SELF"] باستخدام الدالة htmlspecialchars().
يبدو رمز النموذج كما يلي:
<formmethod="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
يقوم htmlspecialchars() بتحويل بعض الأحرف المحددة مسبقًا إلى كيانات HTML. الآن إذا أراد المستخدم استخدام المتغير PHP_SELF، فسيتم إخراج النتيجة على النحو التالي:
<formmethod="post" action="test_form.php/"><script>alert('hacked')</script>">
محاولة استغلال هذا الاستغلال فشلت!
أولاً، نقوم بمعالجة جميع البيانات المقدمة من قبل المستخدمين من خلال وظيفة htmlspecialchars() الخاصة بـ PHP.
عندما نستخدم الدالة htmlspecialchars()، يحاول المستخدم إرسال حقل النص التالي:
<script>location.href('http://www.codercto.com')</script>
لن يتم تنفيذ هذا الرمز لأنه سيتم حفظه كرمز HTML هروب مثل هذا:
<script>location.href('http://www.codercto.com')</script>
الكود أعلاه آمن ويمكن عرضه بشكل طبيعي على الصفحة أو إدراجه في رسائل البريد الإلكتروني.
عندما يقوم المستخدم بإرسال النموذج، سنقوم بالأمرين التاليين:
استخدم وظيفة PHP Trim() لإزالة الأحرف غير الضرورية (مثل المسافات وعلامات التبويب والأسطر الجديدة) في بيانات إدخال المستخدم.
استخدم الدالة PHP stripslashes() لإزالة الخطوط المائلة العكسية () من بيانات إدخال المستخدم
بعد ذلك، دعونا نكتب وظائف التصفية هذه في وظيفة نحددها بأنفسنا، والتي يمكن أن تحسن بشكل كبير إمكانية إعادة استخدام الكود.
قم بتسمية الدالة test_input().
الآن، يمكننا استخدام الدالة test_input() للكشف عن جميع المتغيرات في $_POST. رمز البرنامج النصي هو كما يلي:
<?php//حدد المتغيرات وقم بتعيينها على قيم فارغة افتراضيًا $name= $email= $gender= $comment= $website= ""; { $name= test_input($_POST["name"]); $email= test_input($_POST["email"]); $website= test_input($_POST["website"]); $comment= test_input($_POST["comment"]); $gender= test_input($_POST["gender"]);} functiontest_input($data){ $data= Trim ($data)؛ $data= stripslashes($data);
لاحظ أنه عند تنفيذ البرنامج النصي أعلاه، سنستخدم $_SERVER["REQUEST_METHOD"] لاكتشاف ما إذا كان النموذج قد تم إرساله أم لا. إذا كانت REQUEST_METHOD هي POST، فسيتم إرسال النموذج - وسيتم التحقق من صحة البيانات. إذا لم يتم إرسال النموذج، فسيتم تخطي التحقق من الصحة وسيظهر فارغًا.
يعد استخدام عناصر الإدخال في الأمثلة المذكورة أعلاه أمرًا اختياريًا ويمكن عرضه بشكل طبيعي حتى لو لم يُدخل المستخدم أي بيانات.
سنقدم في الفصل التالي كيفية التحقق من صحة البيانات المدخلة من قبل المستخدم.