✅ أولًا: مقدمة عن التصفية (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