דלגו לתוכן

XMF בַּקָשָׁה

ה Xmf\Request class מספקת גישה מבוקרת ל HTTP בקש משתנים עם חיטוי מובנה והמרת סוג. הוא מגן מפני הזרקות שעלולות להיות מזיקות כברירת מחדל תוך התאמה של קלט לסוגים שצוינו.

טיפול בבקשות הוא אחד ההיבטים הקריטיים ביותר לאבטחה בפיתוח אתרים. ה XMF בקשת שיעור:

  • מחטא באופן אוטומטי קלט כדי למנוע XSS התקפות
  • מספק אביזרים בטוחים לסוגי נתונים נפוצים
  • תומך במספר מקורות בקשות (GET, POST, COOKIEוכו’)
  • מציע טיפול עקבי בערך ברירת מחדל
use Xmf\Request;
// Get string input
$name = Request::getString('name', '');
// Get integer input
$id = Request::getInt('id', 0);
// Get from specific source
$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 - Hash מקור: GET, POST, FILES, COOKIE, ENV, SERVER, METHOD, או REQUEST (ברירת מחדל)
  • $type - סוג נתונים לניקוי (ראה סוגי קלט מסנן להלן)
  • $mask - מסכת סיביות לאפשרויות ניקוי

ערכי מסכה:

מסכה קבועהאפקט
MASK_NO_TRIMלא לקצץ leading/trailing רווח לבן
MASK_ALLOW_RAWדלג על ניקוי, אפשר קלט גולמי
MASK_ALLOW_HTMLאפשר סט מוגבל “בטוח” של HTML סימון
// Get raw input without cleaning
$rawHtml = Request::getVar('content', '', 'POST', 'STRING', Request::MASK_ALLOW_RAW);
// Allow safe 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');
// Allow some 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', '');

מחזירה an HTTP ערך כותרת בקשה.

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

בדוק אם קיים משתנה ב-hash שצוין.

if (Request::hasVar('submit', 'POST')) {
// Form was submitted
}
if (Request::hasVar('id', 'GET')) {
// ID parameter exists
}

הגדר משתנה ב-hash שצוין. מחזירה את הערך הקודם או null.

// Set a value
$oldValue = Request::setVar('processed', true, 'POST');
// Only set if not already exists
Request::setVar('default_op', 'list', 'GET', false);

מחזירה עותק נקי של מערך Hash שלם.

// Get all POST data cleaned
$postData = Request::get('POST');
// Get all GET data
$getData = Request::get('GET');
// Get REQUEST data with no trimming
$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פקודה - א-ז, 0-9, קו תחתון, מקף, נקודה (אותיות קטנות)
EMAILכתובת אימייל חוקית
FLOAT / DOUBLEמספר נקודה צפה
INTEGER / INTערך מספר שלם
IPכתובת IP חוקית
PATHמערכת קבצים או נתיב אינטרנט
STRINGמחרוזת כללית (ברירת מחדל)
USERNAMEפורמט שם משתמש
WEBURLאינטרנט URL
WORDאותיות A-Z וקו תחתון בלבד
use Xmf\Request;
if ('POST' === Request::getMethod()) {
// Validate form submission
$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;
// Verify AJAX request
$isAjax = (Request::getHeader('X-Requested-With', '') === 'XMLHttpRequest');
if ($isAjax) {
$action = Request::getCmd('action', '');
$itemId = Request::getInt('item_id', 0);
switch ($action) {
case 'delete':
// Handle delete
break;
case 'update':
$data = Request::getArray('data', []);
// Handle update
break;
}
}
use Xmf\Request;
$page = Request::getInt('page', 1);
$limit = Request::getInt('limit', 20);
$sort = Request::getCmd('sort', 'date');
$order = Request::getWord('order', 'DESC');
// Validate ranges
$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', '');
// Build search criteria
$criteria = new CriteriaCompo();
if (!empty($query)) {
$criteria->add(new Criteria('title', '%' . $query . '%', 'LIKE'));
}
if ($category > 0) {
$criteria->add(new Criteria('category_id', $category));
}

שיטות עבודה מומלצות לאבטחה

Section titled “שיטות עבודה מומלצות לאבטחה”
  1. השתמש תמיד בשיטות ספציפיות לסוג - השתמש getInt() עבור תעודות זהות, getEmail() למיילים וכו’.

  2. ספק ברירות מחדל הגיוניות - לעולם אל תניח שקיים קלט

  3. אמת לאחר חיטוי - חיטוי מסיר נתונים גרועים, אימות מבטיח נתונים נכונים

  4. השתמש ב-hash מתאים - ציין POST עבור נתוני טופס, GET עבור פרמטרי שאילתה

  5. הימנע מקלט גולמי - השתמש רק getText() אוֹ MASK_ALLOW_RAW כאשר הכרחי לחלוטין

// Good - type-specific with default
$id = Request::getInt('id', 0);
// Bad - using getString for numeric data
$id = (int) Request::getString('id', '0');
  • תחילת העבודה עם-XMF - בסיסי XMF מושגים
  • XMF-Module-Helper - שיעור עוזר מודול
  • ../XMF-Framework - סקירת מסגרת

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