فلاتر PHP
تستخدم فلاتر (تصفيات) PHP لفلترة و جعل البيانات شرعية التي تأتي من جهات غير محمية مثل مدخلات المستخدم .
ماهو فلتر / تصفية PHP ؟
تستخدم فلاتر (تصفيات) PHP لفلترة و جعل البيانات شرعية التي تأتي من جهات غير محمية مثل مدخلات المستخدم .
يعتبر اختبار أو تصفية مدخل مستخدم أو أي بيانات تقليدية خطوة مهمة لأي تطبيق على الانترنت .
تم تصميم زيادات فلاتر PHP لجعل فلترة البيانات أسهل وأسرع .
لماذا نستخدم الفلاتر ؟
غالباً تعتمد جميع تطبيقات الانترنت على مدخلات خارجية و ذلك يأتي من مستخدم أو من خلال تطبيق آخر ( مثل خدمات الويب ) و باستخدام الفلترة يمكنك أن تكون واثقاً بأن تطبيقك حصل على نوع المدخل الصحيح .
يجب دائماً استخدام الفلترة للبيانات الخارجية
تعتبر فلترة المدخلات واحدة من أهم القضايا الأمنية المهمة للتطبيقات .
ماهي البيانات الخارجية ؟
- البيانات المدخلة من خلال النماذج .
- الكوكيز cookies .
- بيانات الويب الخدمية .
- نتائج أوامر قواعد البيانات .
الوظائف و الفلاتر في ال بي أتش بي
لفلترة أو تصفية متغير يمكن استخدام احدى هذه الأكواد الوظيفية :
- filter_var() : فلترة متغير واحد مع فلتر محدد .
- filter_var_array() : فلترة متغيرات متعددة مع فلترات متشابهة أو مختلفة .
- filter_input : الحصول على متغير لمدخل واحد و فلترته .
- filter_input_array : الحصول على متغيرات لمدخلات متعددة و فلترتهم مع فلترات مختلفة او متشابهة .
في المثال التالي سنقوم بتفعيل رقم باستخدام الوظيفة filter_var() :
<?php $int = 123; if(!filter_var($int, FILTER_VALIDATE_INT)) { echo("Integer is not valid"); } else { echo("Integer is valid"); } ?>
تم استخدام الفلتر FILTER_VALIDATE_INT لفلترة متغير . بما أن الرقم فعال سيتم إظهار نتيجة الكود "Integer is valid" .
لو كان المتغير ليس رقماً ( مثل "123abc" ) سيتم إظهار نتيجة الكود "Integer is not valid" .
للحصول على قائمة كاملة للوظائف و الفلاتر يمكنك زيارة مرجع فلاتر PHP .
التفعيل Validating و التعقيم Sanitizing
هناك نوعين من الفلترة :
تفعيل الفلاتر
- تستخدم لتفعيل مدخل مستخدم .
- تثبيت القواعد ( مثل تفعيل URL أو Email ) .
- إعادة الأنواع المتوقعة من النجاج أو الفشل .
تعقيم الفلاتر
- تستخدم للمساح أو عدم السماح بحرف معين في النص .
- لايوجد قواعد معينة للبيانات .
- دائماً تعيد نص .
الخيارات و الرايات في php
تستخدم الخيارات والرايات لإضافة فلترة اضافية الى فلتر معين .
تختلف الخيارات والرايات مع اختلاف الفلاتر .
في المثال التالي قمنا بتفعيل رقم معين integer باستخدام filter_var() بالاضافة الى خيارات min_range و max_range :
<?php $var=300; $int_options = array( "options"=>array ( "min_range"=>0, "max_range"=>256 ) ); if(!filter_var($var, FILTER_VALIDATE_INT, $int_options)) { echo("Integer is not valid"); } else { echo("Integer is valid"); } ?>
للحصول على قائمة كاملة للوظائف و الفلاتر يمكنك زيارة مرجع فلاتر PHP . يمكنك فحص كل فلتر لمشاهدة الخيارات و الرايات المتوفرة .
المدخلات المفعلة php
دعنا نقوم بتفعيل مدخل للنموذج .
أول شيء يجب أن نقوم فيه هو تأكيد بأن بيانات الادخال التي نبحث عنها موجودة . ثم نقوم بفلترة البيانات المدخلة باستخدام الوظيفة filter_input() .
في المثال التالي سيتم ارسال مدخل المتغير "email" الى صفحة PHP :
<?php if(!filter_has_var(INPUT_GET, "email")) { echo("Input type does not exist"); } else { if (!filter_input(INPUT_GET, "email", FILTER_VALIDATE_EMAIL)) { echo "E-Mail is not valid"; } else { echo "E-Mail is valid"; } } ?>
شرح المثال
يحتوي المثال السابق على مدخل تم ارساله الى باستخدام طريقة GET :
- سيفحص فيما اذا مدخل البريد email فعال و موجود باستخدام النوع GET .
- اذا كان المتغير موجود سيتم فحص فعالية البريد الالكتروني .
تعقيم المدخلات
دعونا نقوم بتنظيف الرابط URL المرسل من النموذج .
أولاً يجب التأكيد على أن البيانات المدخلة التي نبحث عنها موجودة . ثم نقوم بتعقيم البيانات المدخلة من خلال استخدام الوظيفة filter_input()
في المثال التالي سيتم ارسال مدخل المتغير url الى صفحة PHP :
<?php if(!filter_has_var(INPUT_POST, "url")) { echo("Input type does not exist"); } else { $url = filter_input(INPUT_POST, "url", FILTER_SANITIZE_URL); } ?>
شرح المثال
يحتوي المثال السابق على مدخل url تم ارساله الى باستخدام طريقة POST :
- سيفحص فيما اذا مدخل url فعال و موجود باستخدام النوع POST .
- اذا كان المتغير موجود سيتم تعقيم ( حذف الأحرف الغير فعالة ) و حفظها في المتغير $url .
اذا كان مدخلات المتغير نص عادي مثل http://www.exååmple.com/ سيتم اختيار الرابط الصحيح و تعقيمه من خلال المتغير $url كالتالي :
http://www.Example.com/
فلترة مدخلات متعددة
دائماً مايحتوي النموذج على واحد أو اكثر من مدخلات النصوص . ولتجنب استدعاء filter_var أو filter_input مرات و مرات يمكن استخدام filter_var_array أو filter_input_array .
في المثال التالي قيمنا باستخدام filter_input_array() لفلترة ثلاث متغيرات من نوع GET . المتغير من نوع GET المستلم هو الاسم والعمر و عنوان البريد الالكتروني :
<?php $filters = array ( "name" => array ( "filter"=>FILTER_SANITIZE_STRING ), "age" => array ( "filter"=>FILTER_VALIDATE_INT, "options"=>array ( "min_range"=>1, "max_range"=>120 ) ), "email"=> FILTER_VALIDATE_EMAIL, ); $result = filter_input_array(INPUT_GET, $filters); if (!$result["age"]) { echo("Age must be a number between 1 and 120.<br />"); } elseif(!$result["email"]) { echo("E-Mail is not valid.<br />"); } else { echo("User input is valid"); } ?>
شرح المثال
يحتوي المثال السابق على ثلاث متغيرات ( الاسم و العمر و البريد ) تم ارسالهم الى البريد نفسه باستخدام الطريقة GET
- تم ضبط مصفوفة تحتوي على متغيرات وفلاتر اسم المدخل المستخدمة مع متغير لمدخل محدد .
- استدعاء الوظيفة filter_input_array() مع متغيرات GET المدخلة و المصفوفة التي أنشأناها مسبقاً .
- فحص متغيرات العمر age و البريد الالكتروني email في متغير $result للمدخلات الغير فعالة .
يمكن أن يكون القيمة الثانية في الوظيفة filter_input_array() مصفوفة أو فلتر ID واحد .
اذا كان المتغير فلتر id واحد عندها سيتم فلترة جميع المتغيرات في مصفوفة مدخلات من خلال فلتر محدد .
اذا كان المتغير مصفوفة عندها يجب اتبّاع التعليمات التالية
- يجب أن يكون مرفق بمصفوفة تحتوي على متغير مدخل مثل وسم المصفوفة .
- قيمة المصفوفة يجب أن تكون مفلترة id او مصفوفة تحدد فلتر او راية او خيار .
استدعاء الفلتر
يمكنك استدعاء وظيفة معرفة من خلال المستخدم و استخدامه كفلتر باستخدام ميزة FILTER_CALLBACK . و بهذه الطريقة لديك تحكم كامل بفلترة البيانات .
يمكنك إنشاء وظفة خاصة للمستخدم او استخدام وظائف PHP الحالية .
الوظيفة التي ترغب باستخدامها لفلترتها محددة بنفس الطريقة كخيار مخصص .
في المثال التالي سيتم إنشاء وظيفة تقوم بتحويل جميع "_" الى فراغات :
<?php function convertSpace($string) { return str_replace("_", " ", $string); } $string = "Peter_is_a_great_guy!"; echo filter_var($string, FILTER_CALLBACK, array("options"=>"convertSpace")); ?>
ستظهر النتيجة على المتصفح كالتالي :
Peter is a great guy!
شرح المثال
في المثال التالي سيتم إنشاء وظيفة تقوم بتحويل جميع "_" الى فراغات :
- إنشاء function لاستبدال "_" الى فراغات .
- استدعاء filter_var() مع الفلتر FILTER_CALLBACK و مصفوفة تحتوي على function .