التحقق من صحة نموذج PHP
يوضح هذا والفصول التالية كيفية استخدام PHP للتحقق من صحة بيانات النموذج.
التحقق من صحة نموذج PHP
فكر في الأمان عند معالجة نماذج PHP!
ستوضح هذه الصفحات كيفية معالجة نماذج PHP مع وضع الأمان في الاعتبار. يعد التحقق الصحيح من بيانات النموذج أمرًا مهمًا لحماية النموذج الخاص بك من المتسللين ومرسلي البريد العشوائي!
نموذج HTML الذي سنعمل عليه في هذه الفصول ، يحتوي على حقول إدخال مختلفة: حقول نصية مطلوبة واختيارية ، وأزرار اختيار ، وزر إرسال:
قواعد التحقق من صحة النموذج أعلاه هي كما يلي:
Field | Validation Rules |
---|---|
Name | Required. + Must only contain letters and whitespace |
Required. + Must contain a valid email address (with @ and .) | |
Website | Optional. If present, it must contain a valid URL |
Comment | Optional. Multi-line input field (textarea) |
Gender | Required. Must select one |
سننظر أولاً في كود HTML العادي للنموذج:
حقول النص
تعد حقول الاسم والبريد الإلكتروني وموقع الويب عناصر إدخال نص ، وحقل التعليق عبارة عن منطقة نصية. يبدو كود HTML كما يلي:
Name: <input type="text" name="name">
E-mail: <input type="text" name="email">
Website: <input type="text" name="website">
Comment: <textarea name="comment" rows="5" cols="40"></textarea>
أزرار الراديو
حقول الجنس هي أزرار اختيار ويظهر كود HTML على النحو التالي:
Gender:
<input type="radio" name="gender"
value="female">Female
<input type="radio" name="gender" value="male">Male
<input type="radio" name="gender" value="other">Other
عنصر النموذج
يبدو كود HTML للنموذج كما يلي:
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
عند إرسال النموذج ، يتم إرسال بيانات النموذج باستخدام الطريقة = "post".
ما هو المتغير $ _SERVER ["PHP_SELF"]؟
يعد $ _SERVER ["PHP_SELF"] متغيرًا شاملاً فائقًا يُرجع اسم ملف البرنامج النصي المنفذ حاليًا.
لذلك ، يرسل $ _SERVER ["PHP_SELF"] بيانات النموذج المرسلة إلى الصفحة نفسها ، بدلاً من القفز إلى صفحة مختلفة. بهذه الطريقة ، سيحصل المستخدم على رسائل خطأ على نفس الصفحة مثل النموذج.
ما هي وظيفة htmlspecialchars ()؟
تعمل الدالة htmlspecialchars () على تحويل الأحرف الخاصة إلى كيانات HTML. هذا يعني أنه سيستبدل أحرف HTML مثل <و> بـ & lt؛ و & GT. يمنع هذا المهاجمين من استغلال الكود عن طريق حقن كود HTML أو Javascript (هجمات البرمجة النصية عبر المواقع) في النماذج.
ملاحظة كبيرة حول أمان نموذج PHP
يمكن للقراصنة استخدام المتغير $ _SERVER ["PHP_SELF"]!
إذا تم استخدام PHP_SELF في صفحتك ، فيمكن للمستخدم إدخال شرطة مائلة (/) ثم بعض أوامر Cross Site Scripting (XSS) ليتم تنفيذها.
البرمجة النصية عبر المواقع (XSS) هي نوع من الثغرات الأمنية التي توجد عادة في تطبيقات الويب. يتيح XSS للمهاجمين إدخال برنامج نصي من جانب العميل في صفحات الويب التي يعرضها المستخدمون الآخرون.
افترض أن لدينا النموذج التالي في صفحة تسمى "test_form.php":
<form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">
الآن ، إذا قام مستخدم بإدخال عنوان URL العادي في شريط العناوين مثل "http://www.example.com/test_form.php" ، فستتم ترجمة الكود أعلاه إلى:
<form method="post" action="test_form.php">
حتى الان جيدة جدا.
ومع ذلك ، ضع في اعتبارك أن المستخدم يقوم بإدخال عنوان URL التالي في شريط العناوين:
http://www.example.com/test_form.php/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E
في هذه الحالة ، سيتم ترجمة الكود أعلاه إلى:
<form method="post" action="test_form.php/"><script>alert('hacked')</script>
يضيف هذا الرمز علامة البرنامج النصي وأمر التنبيه. وعندما يتم تحميل الصفحة ، سيتم تنفيذ كود JavaScript (سيرى المستخدم مربع تنبيه). هذا مجرد مثال بسيط وغير ضار لكيفية استغلال المتغير PHP_SELF.
انتبه إلى أنه يمكن إضافة أي كود JavaScript داخل علامة <script>! يمكن للمتسلل إعادة توجيه المستخدم إلى ملف موجود على خادم آخر ، ويمكن لهذا الملف أن يحتوي على تعليمات برمجية ضارة يمكنها تغيير المتغيرات العامة أو إرسال النموذج إلى عنوان آخر لحفظ بيانات المستخدم ، على سبيل المثال.
كيف تتجنب مآثر $ _SERVER ["PHP_SELF"]؟
يمكن تجنب عمليات استغلال $ _SERVER ["PHP_SELF"] باستخدام دالة htmlspecialchars ().
يجب أن يبدو رمز النموذج كما يلي:
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
تعمل الدالة htmlspecialchars () على تحويل الأحرف الخاصة إلى كيانات HTML. الآن إذا حاول المستخدم استغلال متغير PHP_SELF ، فسيؤدي ذلك إلى الناتج التالي:
<form method="post" action="test_form.php/"><script>alert('hacked')</script>">
فشلت محاولة الاستغلال ولا ضرر!
التحقق من صحة بيانات النموذج باستخدام PHP
أول شيء سنفعله هو تمرير جميع المتغيرات من خلال دالة htmlspecialchars () في PHP.
عندما نستخدم الدالة htmlspecialchars () ؛ ثم إذا حاول المستخدم إرسال ما يلي في حقل نصي:
<script> location.href ('http://www.hacked.com') </script>
- لن يتم تنفيذ هذا ، لأنه سيتم حفظه كرمز تم تجاوزه بتنسيق HTML ، على النحو التالي:
& lt؛ script & gt؛ location.href ('http://www.hacked.com') & lt؛ / script & gt؛
أصبح الرمز الآن آمنًا ليتم عرضه على صفحة أو داخل بريد إلكتروني.
سنفعل شيئين آخرين عندما يرسل المستخدم النموذج:
- قم بإزالة الأحرف غير الضرورية (مسافة إضافية ، علامة تبويب ، سطر جديد) من بيانات إدخال المستخدم (باستخدام وظيفة PHP trim ())
- إزالة الخطوط المائلة العكسية (\) من بيانات إدخال المستخدم (باستخدام وظيفة PHP stripslashes ())
تتمثل الخطوة التالية في إنشاء وظيفة تقوم بكل عمليات الفحص لنا (وهو أمر أكثر ملاءمة من كتابة نفس الرمز مرارًا وتكرارًا).
سنقوم بتسمية الوظيفة test_input ().
الآن ، يمكننا التحقق من كل متغير $ _POST باستخدام دالة test_input () ، ويبدو النص كما يلي:
مثال
<?php
// define variables and set to empty values
$name = $email = $gender = $comment = $website = "";
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$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"]);
}
function test_input($data) {
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
?>
لاحظ أنه في بداية البرنامج النصي ، نتحقق مما إذا كان قد تم إرسال النموذج باستخدام $ _SERVER ["REQUEST_METHOD"]. إذا كان REQUEST_METHOD هو POST ، فهذا يعني أنه تم إرسال النموذج - ويجب التحقق من صحته. إذا لم يتم تقديمه ، فتخط عملية التحقق واعرض نموذجًا فارغًا.
ومع ذلك ، في المثال أعلاه ، تعتبر جميع حقول الإدخال اختيارية. يعمل البرنامج النصي بشكل جيد حتى إذا لم يقم المستخدم بإدخال أية بيانات.
الخطوة التالية هي جعل حقول الإدخال مطلوبة وإنشاء رسائل خطأ إذا لزم الأمر.