Požadavek XMF
Třída XMF\Request poskytuje řízený přístup k proměnným požadavku HTTP s vestavěnou sanitací a konverzí typu. Ve výchozím nastavení chrání před potenciálně škodlivými injekcemi a zároveň přizpůsobuje vstup specifikovaným typům.
Přehled
Sekce “Přehled”Zpracování požadavků je jedním z nejdůležitějších bezpečnostních aspektů vývoje webu. Třída požadavku XMF:
- Automaticky dezinfikuje vstup, aby se zabránilo útokům XSS
- Poskytuje typově bezpečné přístupové objekty pro běžné typy dat
- Podporuje více zdrojů požadavků (GET, POST, COOKIE atd.)
- Nabízí konzistentní zpracování výchozích hodnot
Základní použití
Sekce “Základní použití”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');Metody požadavku
Sekce “Metody požadavku”getMethod()
Sekce “getMethod()”Vrátí metodu požadavku HTTP pro aktuální požadavek.
$method = Request::getMethod();// Returns: 'GET', 'HEAD', 'POST', or 'PUT'getVar($name, $default, $hash, $type, $mask)
Sekce “getVar($name, $default, $hash, $type, $mask)”Základní metoda, kterou vyvolává většina ostatních metod get*(). Načte a vrátí pojmenovanou proměnnou z dat požadavku.
Parametry:
$name- Název proměnné k načtení$default- Výchozí hodnota, pokud proměnná neexistuje$hash- Zdroj hash: GET, POST, FILES, COOKIE, ENV, ZX01XQ09001, ZX01XQ0001 nebo REQUEST (výchozí)$type- Typ dat pro čištění (viz typy vstupu filtru níže)$mask- Bitová maska pro možnosti čištění
Hodnoty masky:
| Maska konstantní | Efekt |
|---|---|
MASK_NO_TRIM | Neořezávejte mezery leading/trailing |
MASK_ALLOW_RAW | Přeskočit čištění, povolit vstup surového |
MASK_ALLOW_HTML | Povolit omezenou „bezpečnou“ sadu značek 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);Typově specifické metody
Sekce “Typově specifické metody”getInt($name, $default, $hash)
Sekce “getInt($name, $default, $hash)”Vrátí celočíselnou hodnotu. Jsou povoleny pouze číslice.
$id = Request::getInt('id', 0);$page = Request::getInt('page', 1, 'GET');getFloat($name, $default, $hash)
Sekce “getFloat($name, $default, $hash)”Vrátí plovoucí hodnotu. Jsou povoleny pouze číslice a tečky.
$price = Request::getFloat('price', 0.0);$rate = Request::getFloat('rate', 1.0, 'POST');getBool($name, $default, $hash)
Sekce “getBool($name, $default, $hash)”Vrátí booleovskou hodnotu.
$enabled = Request::getBool('enabled', false);$subscribe = Request::getBool('subscribe', false, 'POST');getWord($name, $default, $hash)
Sekce “getWord($name, $default, $hash)”Vrátí řetězec obsahující pouze písmena a podtržítka [A-Za-z_].
$action = Request::getWord('action', 'view');getCmd($name, $default, $hash)
Sekce “getCmd($name, $default, $hash)”Vrátí příkazový řetězec pouze se [A-Za-z0-9.-_], vynucený na malá písmena.
$op = Request::getCmd('op', 'list');// Input "View_Item" becomes "view_item"getString($name, $default, $hash, $mask)
Sekce “getString($name, $default, $hash, $mask)”Vrátí vyčištěný řetězec s odstraněným špatným kódem HTML (pokud není přepsán maskou).
$title = Request::getString('title', '');$description = Request::getString('description', '', 'POST');
// Allow some HTML$content = Request::getString('content', '', 'POST', Request::MASK_ALLOW_HTML);getArray($name, $default, $hash)
Sekce “getArray($name, $default, $hash)”Vrátí pole, rekurzivně zpracované k odstranění XSS a špatného kódu.
$items = Request::getArray('items', [], 'POST');$selectedIds = Request::getArray('selected', []);getText($name, $default, $hash)
Sekce “getText($name, $default, $hash)”Vrátí nezpracovaný text bez čištění. Používejte opatrně.
$rawContent = Request::getText('raw_content', '');getUrl($name, $default, $hash)
Sekce “getUrl($name, $default, $hash)”Vrátí ověřený web URL (pouze schémata relativní, http nebo https).
$website = Request::getUrl('website', '');$returnUrl = Request::getUrl('return', 'index.php');getPath($name, $default, $hash)
Sekce “getPath($name, $default, $hash)”Vrátí ověřený souborový systém nebo webovou cestu.
$filePath = Request::getPath('file', '');getEmail($name, $default, $hash)
Sekce “getEmail($name, $default, $hash)”Vrátí ověřenou e-mailovou adresu nebo výchozí.
$email = Request::getEmail('email', '');$contactEmail = Request::getEmail('contact', 'default@example.com');getIP($name, $default, $hash)
Sekce “getIP($name, $default, $hash)”Vrátí ověřenou adresu IPv4 nebo IPv6.
$userIp = Request::getIP('client_ip', '');getHeader($headerName, $default)
Sekce “getHeader($headerName, $default)”Vrátí hodnotu záhlaví požadavku HTTP.
$contentType = Request::getHeader('Content-Type', '');$userAgent = Request::getHeader('User-Agent', '');$authHeader = Request::getHeader('Authorization', '');Užitkové metody
Sekce “Užitkové metody”hasVar($name, $hash)
Sekce “hasVar($name, $hash)”Zkontrolujte, zda v zadaném hashu existuje proměnná.
if (Request::hasVar('submit', 'POST')) { // Form was submitted}
if (Request::hasVar('id', 'GET')) { // ID parameter exists}setVar($name, $value, $hash, $overwrite)
Sekce “setVar($name, $value, $hash, $overwrite)”Nastavte proměnnou v zadaném hash. Vrátí předchozí hodnotu nebo null.
// Set a value$oldValue = Request::setVar('processed', true, 'POST');
// Only set if not already existsRequest::setVar('default_op', 'list', 'GET', false);získat ($hash, $mask)
Sekce “získat ($hash, $mask)”Vrátí vyčištěnou kopii celého pole 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);sada ($array, $hash, $overwrite)
Sekce “sada ($array, $hash, $overwrite)”Nastaví více proměnných z pole.
$defaults = [ 'page' => 1, 'limit' => 10, 'sort' => 'date'];Request::set($defaults, 'GET', false); // Don't overwrite existingIntegrace vstupu filtru
Sekce “Integrace vstupu filtru”Třída Request používá k čištění XMF\FilterInput. Dostupné typy filtrů:| Typ | Popis |
|------|--------------|
| ALPHANUM / ALNUM | Pouze alfanumerické |
| ARRAY | Rekurzivně vyčistěte každý prvek |
| BASE64 | Base64 kódovaný řetězec |
| BOOLEAN / BOOL | Pravda nebo nepravda |
| CMD | Příkaz - A-Z, 0-9, podtržítko, pomlčka, tečka (malá písmena) |
| EMAIL | Platná emailová adresa |
| FLOAT / DOUBLE | Číslo s plovoucí desetinnou čárkou |
| INTEGER / INT | Celočíselná hodnota |
| IP | Platná IP adresa |
| PATH | Souborový systém nebo webová cesta |
| STRING | Obecný řetězec (výchozí) |
| USERNAME | Formát uživatelského jména |
| WEBURL | Web URL |
| WORD | Pouze písmena A-Z a podtržítko |
Praktické příklady
Sekce “Praktické příklady”Zpracování formuláře
Sekce “Zpracování formuláře”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'; }}Manipulátor AJAX
Sekce “Manipulátor AJAX”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; }}Stránkování
Sekce “Stránkování”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;Vyhledávací formulář
Sekce “Vyhledávací formulář”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));}Nejlepší bezpečnostní postupy
Sekce “Nejlepší bezpečnostní postupy”-
Vždy používejte metody specifické pro daný typ – Pro ID použijte
getInt(), pro e-mailygetEmail()atd. -
Uveďte rozumné výchozí hodnoty - Nikdy nepředpokládejte, že vstup existuje
-
Validate after sanitization – Sanitizace odstraní špatná data, validace zajistí správná data
-
Použijte vhodný hash – Zadejte POST pro data formuláře, GET pro parametry dotazu
-
Vyhněte se nezpracovaným vstupům –
getText()neboMASK_ALLOW_RAWpoužívejte pouze tehdy, je-li to nezbytně nutné
// Good - type-specific with default$id = Request::getInt('id', 0);
// Bad - using getString for numeric data$id = (int) Request::getString('id', '0');Viz také
Sekce “Viz také”- Začínáme s-XMF - Základní koncepty XMF
- XMF-Module-Helper - Třída pomocníka modulu
- ../XMF-Framework - Přehled rámce
#xmf #request #security #input-validation #sanitization