Filters

✅ أولًا: مقدمة عن التصفية (Filtering) في PHP

📌 PHP توفر مجموعة من الفلترات الجاهزة (Filters) لفحص وتحويل بيانات المستخدم بطريقة آمنة، خاصة عبر:

  • $_GET, $_POST, $_REQUEST
  • البيانات القادمة من النماذج أو من الـ API
🔹 1. filter_list() – عرض جميع الفلاتر المتوفرة

📘 تُرجع قائمة بكل الفلاتر التي تدعمها PHP:

print_r(filter_list());
PHP

🔸 الإخراج:

Array
(
    [0] => int
    [1] => boolean
    [2] => float
    [3] => validate_regexp
    [4] => validate_email
    ...
)
PHP

🟢 الفائدة: تعرف أنواع الفلاتر التي تستطيع استخدامها مع filter_var أو filter_input.

🔹 2. filter_id() – جلب رقم الفلتر من اسمه

📘 بعض الدوال تطلب رقم الفلتر (ID) بدل اسمه، استخدم هذه الدالة للحصول عليه:

echo filter_id("validate_email"); // مثلاً تُخرج 274
PHP

🟢 الفائدة: تستخدمها عندما تحتاج تمرير الـ ID بشكل ديناميكي بدل كتابة اسم الفلتر مباشرة.

🔹 3. filter_var() – تصفية أو التحقق من قيمة

📘 أهم دالة، تُستخدم للتحقق أو تصفية قيمة واحدة مثل بريد إلكتروني، رقم، عنوان URL…

🧪 مثال 1: التحقق من بريد إلكتروني
$email = "[email protected]";

if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
    echo "بريد صحيح ✅";
} else {
    echo "بريد خاطئ ❌";
}
PHP
🧪 مثال 2: التحقق من عدد صحيح
$num = "123";

if (filter_var($num, FILTER_VALIDATE_INT)) {
    echo "عدد صحيح";
}
PHP
🧪 مثال 3: تصفية رقم (إزالة الحروف)
$value = "100abc";

$clean = filter_var($value, FILTER_SANITIZE_NUMBER_INT);
echo $clean;  // 100
PHP
🧪 مثال 4: تصفية URL
$url = "https://google.com";

if (filter_var($url, FILTER_VALIDATE_URL)) {
    echo "رابط صحيح";
}
PHP
💡 فلترة vs تحقق
العمليةمثال فلتروصف
التحقق (Validate)FILTER_VALIDATE_EMAILيتأكد إذا كانت القيمة صالحة
التصفية (Sanitize)FILTER_SANITIZE_STRING (قديمة)تنظف وتحذف الرموز غير المرغوبة
📋 أهم الفلاتر المستخدمة:
الفلترالاستخدام
FILTER_VALIDATE_EMAILيتحقق من البريد
FILTER_VALIDATE_URLيتحقق من الرابط
FILTER_VALIDATE_INTيتحقق من عدد صحيح
FILTER_VALIDATE_FLOATيتحقق من عدد عشري
FILTER_SANITIZE_STRINGيزيل الرموز (قديمة وتم حذفها من PHP 8.1)
FILTER_SANITIZE_EMAILينظف البريد من الرموز الغريبة
FILTER_SANITIZE_URLينظف الرابط
⚠️ محاذير ونصائح:
  • ✅ استخدم الفلاتر دومًا مع مدخلات المستخدم.
  • ❌ لا تعتمد فقط على JavaScript في التحقق (التحقق يجب أن يكون من السيرفر أيضًا).
  • ⚠️ FILTER_SANITIZE_STRING تم إزالته من PHP 8.1، فانتبه عند التحديث.
  • 🔐 الفلاتر لا تغني عن التحقق الأمني العميق (مثل Prepared Statements لقاعدة البيانات).
🧠 مثال تطبيقي واقعي:
$username = $_GET["user"];

if (filter_var($username, FILTER_SANITIZE_STRING)) {
    echo "مرحبًا، " . $username;
} else {
    echo "اسم غير صالح!";
}
PHP

🔴 ⚠️ لكن كما ذكرنا أعلاه، FILTER_SANITIZE_STRING تم إزالته في PHP 8.1، لذلك الأفضل استخدام:

$username = htmlspecialchars($_GET["user"]);
PHP
🔹 أولًا: أنواع الفلاتر (Filters) في PHP

تنقسم الفلاتر إلى نوعين:

✅ 1. Validation Filters (فلاتر التحقق)

تُستخدم لفحص ما إذا كانت القيمة صالحة (مناسبة لنوع معين).

الفلترالوصف
FILTER_VALIDATE_INTالتحقق من أن القيمة عدد صحيح
FILTER_VALIDATE_BOOLEANيتحقق من true/false
FILTER_VALIDATE_FLOATالتحقق من عدد عشري
FILTER_VALIDATE_REGEXPالتحقق باستخدام تعبير منتظم
FILTER_VALIDATE_URLالتحقق من صحة رابط
FILTER_VALIDATE_EMAILالتحقق من بريد إلكتروني صحيح
FILTER_VALIDATE_IPالتحقق من عنوان IP
FILTER_VALIDATE_MACالتحقق من عنوان MAC
FILTER_VALIDATE_DOMAINالتحقق من اسم نطاق
FILTER_VALIDATE_URLالتحقق من عنوان URL
FILTER_VALIDATE_ENUM(من PHP 8.1) التحقق أن القيمة من ضمن مجموعة
🧪 مثال: FILTER_VALIDATE_INT
$age = "25";
if (filter_var($age, FILTER_VALIDATE_INT)) {
    echo "عمر صالح";
}
PHP
✅ 2. Sanitizing Filters (فلاتر التنقية)

تقوم بإزالة أو تعديل القيم غير الصالحة لتصبح آمنة.

الفلترالوصف
FILTER_SANITIZE_EMAILإزالة الأحرف غير الصالحة من بريد إلكتروني
FILTER_SANITIZE_ENCODEDترميز URL
FILTER_SANITIZE_NUMBER_FLOATإزالة الأحرف غير الرقمية من رقم عشري
FILTER_SANITIZE_NUMBER_INTإزالة كل شيء غير رقمي من عدد صحيح
FILTER_SANITIZE_SPECIAL_CHARSترميز الأحرف الخاصة (HTML)
FILTER_SANITIZE_FULL_SPECIAL_CHARSأقوى في الترميز
FILTER_SANITIZE_STRING(تمت إزالته من PHP 8.1)
FILTER_SANITIZE_URLإزالة الأحرف غير الصالحة من عنوان URL
🧪 مثال: FILTER_SANITIZE_EMAIL
$email = "bad_email@@@example.com";
$clean = filter_var($email, FILTER_SANITIZE_EMAIL);
echo $clean; // "[email protected]"
PHP
🔧 خيارات إضافية (Flags) يمكن استخدامها مع الفلاتر

مثلًا في FILTER_VALIDATE_INT يمكن إضافة خيارات:

$age = "20";

$options = [
    "options" => [
        "min_range" => 18,
        "max_range" => 40
    ]
];

if (filter_var($age, FILTER_VALIDATE_INT, $options)) {
    echo "مقبول بالعمر";
}
PHP
✳️ filter_input() – تصفية مباشرة من مدخلات المستخدم
$email = filter_input(INPUT_GET, "email", FILTER_VALIDATE_EMAIL);
PHP

🔸 تقرأ مباشرة من $_GET أو $_POST وتُطبق الفلتر.

🧠 ملخص لأهم الفلاتر العملية:
الفئةالفلاتر
التحقق من أنواعFILTER_VALIDATE_INT, FLOAT, BOOLEAN, EMAIL, URL, IP
التنقيةFILTER_SANITIZE_EMAIL, SANITIZE_URL, SANITIZE_NUMBER_INT, SPECIAL_CHARS
خيارات إضافيةmin_range, max_range, flags مثل FILTER_FLAG_ALLOW_FRACTION
⚠️ نصائح ومحاذير:
  • ⚠️ لا تستخدم FILTER_SANITIZE_STRING في PHP 8.1 وما بعدها لأنه تم حذفه.
  • ✅ استخدم htmlspecialchars() عند إخراج البيانات في HTML لحماية XSS.
  • ✅ فلاتر PHP مفيدة لكنها لا تغني عن التحقق الكامل عند التعامل مع قاعدة بيانات (استخدم دائمًا Prepared Statements).
✅ فلاتر التحقق (Validation Filters) الإضافية
الفلترالوصف
FILTER_VALIDATE_URLيتحقق من صحة الرابط
FILTER_VALIDATE_DOMAINيتحقق من اسم النطاق
FILTER_VALIDATE_MACيتحقق من عنوان MAC
FILTER_VALIDATE_IPيتحقق من عنوان IP (IPv4/IPv6)
FILTER_VALIDATE_REGEXPتحقق باستخدام تعبير منتظم
FILTER_VALIDATE_ENUM 🆕(من PHP 8.1) تحقق أن القيمة ضمن مجموعة
✅ فلاتر التنقية (Sanitization Filters) الإضافية
الفلترالوصف
FILTER_SANITIZE_ENCODEDترميز URL
FILTER_SANITIZE_NUMBER_INTإزالة الأحرف غير الرقمية من عدد صحيح
FILTER_SANITIZE_NUMBER_FLOATإزالة الأحرف غير الرقمية من عدد عشري
FILTER_SANITIZE_SPECIAL_CHARSترميز الأحرف الخاصة إلى HTML entities
FILTER_SANITIZE_FULL_SPECIAL_CHARSنسخة أقوى من السابقة
FILTER_SANITIZE_URLتنقية رابط URL
FILTER_SANITIZE_EMAILتنقية بريد إلكتروني

⚠️ FILTER_SANITIZE_STRING تم حذفه من PHP 8.1، ولا يُنصح باستخدامه.

🔧 الأعلام (Flags) المساعدة للفلاتر
تستخدم لتعديل سلوك الفلاتر:
مع FILTER_VALIDATE_INT أو FLOAT:
العلمالوصف
FILTER_FLAG_ALLOW_THOUSANDالسماح بـ الفاصلة كفاصل الآلاف
FILTER_FLAG_ALLOW_FRACTIONالسماح بالأرقام العشرية
FILTER_FLAG_ALLOW_SCIENTIFICالسماح بالترميز العلمي 1.2e3
مع FILTER_VALIDATE_EMAIL و URL:
العلمالوصف
FILTER_FLAG_EMAIL_UNICODEيدعم Unicode
FILTER_FLAG_PATH_REQUIREDيتطلب وجود مسار في الرابط
FILTER_FLAG_QUERY_REQUIREDيتطلب وجود استعلام (query string)
مع FILTER_VALIDATE_IP:
العلمالوصف
FILTER_FLAG_IPV4يسمح فقط بـ IPv4
FILTER_FLAG_IPV6يسمح فقط بـ IPv6
FILTER_FLAG_NO_RES_RANGEيمنع IP المحجوزة
FILTER_FLAG_NO_PRIV_RANGEيمنع IP الخاصة (مثل 192.168.*)
💡 دوال مهمة مرتبطة بالفلاتر
الدالةالاستخدام
filter_list()تعرض جميع أسماء الفلاتر
filter_id("FILTER_VALIDATE_EMAIL")تُعيد رقم الفلتر
filter_var()تطبق فلتر على قيمة واحدة
filter_input()تطبق فلتر على مدخل معين من $_GET أو $_POST
filter_input_array()تطبق عدة فلاتر على مجموعة مدخلات
🧪 مثال عملي متقدم:
$data = [
    'email' => '[email protected]',
    'age'   => '25',
    'url'   => 'https://example.com?ref=1'
];

$filters = [
    'email' => FILTER_VALIDATE_EMAIL,
    'age'   => ['filter' => FILTER_VALIDATE_INT, 'options' => ['min_range' => 18]],
    'url'   => ['filter' => FILTER_VALIDATE_URL, 'flags' => FILTER_FLAG_PATH_REQUIRED]
];

$result = filter_var_array($data, $filters);

print_r($result);
PHP