تخطَّ إلى المحتوى

طلب XMF

توفر فئة Xmf\Request وصولا يتحكم فيه إلى متغيرات طلب HTTP مع معالجة وتحويل نوع مدمج. إنه يحمي من الحقن الضارة المحتملة افتراضيا أثناء الامتثال للإدخال إلى أنواع محددة.

معالجة الطلبات هي واحدة من أكثر جوانب أمان تطوير الويب حساسية. فئة طلب XMF:

  • معالجة المدخلات تلقائيا لمنع هجمات XSS
  • توفير أجهزة وصول آمنة للأنواع البيانات الشائعة
  • دعم مصادر طلبات متعددة (GET وPOST و COOKIE وما إلى ذلك)
  • توفر معالجة قيمة افتراضية متسقة
use Xmf\Request;
// احصل على إدخال سلسلة نصية
$name = Request::getString('name', '');
// احصل على إدخال عدد صحيح
$id = Request::getInt('id', 0);
// احصل من مصدر محدد
$postData = Request::getString('data', '', 'POST');

يعيد طريقة طلب HTTP للطلب الحالي.

$method = Request::getMethod();
// Returns: 'GET', 'HEAD', 'POST', or 'PUT'

getVar($name, $default, $hash, $type, $mask)

Section titled “getVar($name, $default, $hash, $type, $mask)”

الطريقة الأساسية التي تستدعيها معظم طرق get*(). جلب وإرجاع متغير مسمى من بيانات الطلب.

المعاملات:

  • $name - اسم المتغير المراد جلبه
  • $default - القيمة الافتراضية إذا لم يكن المتغير موجودا
  • $hash - تجزئة المصدر: GET أو POST أو FILES أو COOKIE أو ENV أو SERVER أو METHOD أو REQUEST (افتراضي)
  • $type - نوع البيانات للتنظيف (انظر أنواع FilterInput أدناه)
  • $mask - قناع بت لخيارات التنظيف

قيم القناع:

ثابت القناعالتأثير
MASK_NO_TRIMلا تقم بقص المسافات البيضاء البادئة/الزائدة
MASK_ALLOW_RAWتخطي التنظيف والسماح بالإدخال الخام
MASK_ALLOW_HTMLالسماح بمجموعة محدودة “آمنة” من ترميز HTML
// احصل على إدخال خام بدون تنظيف
$rawHtml = Request::getVar('content', '', 'POST', 'STRING', Request::MASK_ALLOW_RAW);
// السماح HTML آمن
$content = Request::getVar('body', '', 'POST', 'STRING', Request::MASK_ALLOW_HTML);

يعيد قيمة عدد صحيح. يُسمح فقط بالأرقام.

$id = Request::getInt('id', 0);
$page = Request::getInt('page', 1, 'GET');

يعيد قيمة عائمة. يُسمح فقط بالأرقام والفترات.

$price = Request::getFloat('price', 0.0);
$rate = Request::getFloat('rate', 1.0, 'POST');

يعيد قيمة منطقية.

$enabled = Request::getBool('enabled', false);
$subscribe = Request::getBool('subscribe', false, 'POST');

يعيد سلسلة نصية تحتوي على أحرف وشرطات سفلية فقط [A-Za-z_].

$action = Request::getWord('action', 'view');

يعيد سلسلة أوامر تحتوي على [A-Za-z0-9.-_] فقط، مجبرة على الأحرف الصغيرة.

$op = Request::getCmd('op', 'list');
// Input "View_Item" becomes "view_item"

يعيد سلسلة نصية نظيفة مع إزالة رمز HTML السيء (ما لم يتجاوز حسب القناع).

$title = Request::getString('title', '');
$description = Request::getString('description', '', 'POST');
// السماح ببعض HTML
$content = Request::getString('content', '', 'POST', Request::MASK_ALLOW_HTML);

يعيد مصفوفة، تتم معالجتها بشكل متكرر لإزالة XSS والرمز السيء.

$items = Request::getArray('items', [], 'POST');
$selectedIds = Request::getArray('selected', []);

يعيد نص خام بدون تنظيف. استخدم بحذر.

$rawContent = Request::getText('raw_content', '');

يعيد عنوان URL على الويب الذي تم التحقق من صحته (المسارات النسبية و http أو https فقط).

$website = Request::getUrl('website', '');
$returnUrl = Request::getUrl('return', 'index.php');

يعيد مسار نظام ملفات أو مسار ويب تم التحقق من صحته.

$filePath = Request::getPath('file', '');

يعيد عنوان بريد إلكتروني مصرح به أو الافتراضي.

$email = Request::getEmail('email', '');
$contactEmail = Request::getEmail('contact', 'default@example.com');

يعيد عنوان IPv4 أو IPv6 الذي تم التحقق من صحته.

$userIp = Request::getIP('client_ip', '');

يعيد قيمة رأس طلب HTTP.

$contentType = Request::getHeader('Content-Type', '');
$userAgent = Request::getHeader('User-Agent', '');
$authHeader = Request::getHeader('Authorization', '');

تحقق من وجود متغير في تجزئة محددة.

if (Request::hasVar('submit', 'POST')) {
// تم إرسال النموذج
}
if (Request::hasVar('id', 'GET')) {
// معامل ID موجود
}

اضبط متغيرا في تجزئة محددة. يرجع القيمة السابقة أو فارغة.

// اضبط قيمة
$oldValue = Request::setVar('processed', true, 'POST');
// يتم التعيين فقط إذا لم يكن موجودا بالفعل
Request::setVar('default_op', 'list', 'GET', false);

يعيد نسخة نظيفة من مصفوفة تجزئة كاملة.

// احصل على جميع بيانات POST الموثقة
$postData = Request::get('POST');
// احصل على جميع بيانات GET
$getData = Request::get('GET');
// احصل على بيانات REQUEST بدون قص
$requestData = Request::get('REQUEST', Request::MASK_NO_TRIM);

يعين متغيرات متعددة من مصفوفة.

$defaults = [
'page' => 1,
'limit' => 10,
'sort' => 'date'
];
Request::set($defaults, 'GET', false); // Don't overwrite existing

يستخدم فئة Request Xmf\FilterInput للتنظيف. أنواع المرشحات المتاحة:

النوعالوصف
ALPHANUM / ALNUMأبجدية رقمية فقط
ARRAYتنظيف كل عنصر بشكل متكرر
BASE64سلسلة ترميز Base64
BOOLEAN / BOOLصحيح أو خاطئ
CMDالأمر - A-Z، 0-9، شرطة سفلية، شرطة، فترة (أحرف صغيرة)
EMAILعنوان بريد إلكتروني صحيح
FLOAT / DOUBLEرقم عائم
INTEGER / INTقيمة عدد صحيح
IPعنوان IP صحيح
PATHمسار نظام ملفات أو مسار ويب
STRINGسلسلة عامة (افتراضي)
USERNAMEتنسيق اسم المستخدم
WEBURLعنوان URL على الويب
WORDالأحرف A-Z والشرطة السفلية فقط
use Xmf\Request;
if ('POST' === Request::getMethod()) {
// التحقق من صحة إرسال النموذج
$title = Request::getString('title', '');
$content = Request::getString('content', '', 'POST', Request::MASK_ALLOW_HTML);
$categoryId = Request::getInt('category_id', 0);
$tags = Request::getArray('tags', []);
$published = Request::getBool('published', false);
if (empty($title)) {
$errors[] = 'Title is required';
}
if ($categoryId <= 0) {
$errors[] = 'Please select a category';
}
}
use Xmf\Request;
// التحقق من طلب AJAX
$isAjax = (Request::getHeader('X-Requested-With', '') === 'XMLHttpRequest');
if ($isAjax) {
$action = Request::getCmd('action', '');
$itemId = Request::getInt('item_id', 0);
switch ($action) {
case 'delete':
// معالجة الحذف
break;
case 'update':
$data = Request::getArray('data', []);
// معالجة التحديث
break;
}
}
use Xmf\Request;
$page = Request::getInt('page', 1);
$limit = Request::getInt('limit', 20);
$sort = Request::getCmd('sort', 'date');
$order = Request::getWord('order', 'DESC');
// التحقق من النطاقات
$page = max(1, $page);
$limit = min(100, max(10, $limit));
$order = in_array($order, ['ASC', 'DESC']) ? $order : 'DESC';
$offset = ($page - 1) * $limit;
use Xmf\Request;
$query = Request::getString('q', '');
$category = Request::getInt('cat', 0);
$dateFrom = Request::getString('from', '');
$dateTo = Request::getString('to', '');
// بناء معايير البحث
$criteria = new CriteriaCompo();
if (!empty($query)) {
$criteria->add(new Criteria('title', '%' . $query . '%', 'LIKE'));
}
if ($category > 0) {
$criteria->add(new Criteria('category_id', $category));
}
  1. استخدم دائما طرق خاصة بالنوع - استخدم getInt() للمعرفات وgetEmail() للبريد الإلكتروني وما إلى ذلك.

  2. توفير قيم افتراضية معقولة - لا تفترض أن الإدخال موجود أبدا

  3. التحقق بعد المعالجة - تزيل المعالجة البيانات السيئة والتحقق من صحة يضمن البيانات الصحيحة

  4. استخدم تجزئة مناسبة - حدد POST لبيانات النموذج و GET لمعاملات الاستعلام

  5. تجنب الإدخال الخام - استخدم getText() أو MASK_ALLOW_RAW فقط عند الضرورة المطلقة

// جيد - خاص بالنوع مع افتراضي
$id = Request::getInt('id', 0);
// سيء - استخدام getString للبيانات الرقمية
$id = (int) Request::getString('id', '0');
  • Getting-Started-with-XMF - مفاهيم XMF الأساسية
  • XMF-Module-Helper - فئة مساعد الوحدة
  • ../XMF-Framework - نظرة عامة على الإطار

#xmf #request #security #input-validation #sanitization