Přeskočit na obsah

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.

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
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');

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_TRIMNeořezávejte mezery leading/trailing
MASK_ALLOW_RAWPřeskočit čištění, povolit vstup surového
MASK_ALLOW_HTMLPovolit 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', '');

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 exists
Request::setVar('default_op', 'list', 'GET', false);

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 existing

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 |

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';
}
}
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;

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”
  1. Vždy používejte metody specifické pro daný typ – Pro ID použijte getInt(), pro e-maily getEmail() atd.

  2. Uveďte rozumné výchozí hodnoty - Nikdy nepředpokládejte, že vstup existuje

  3. Validate after sanitization – Sanitizace odstraní špatná data, validace zajistí správná data

  4. Použijte vhodný hash – Zadejte POST pro data formuláře, GET pro parametry dotazu

  5. Vyhněte se nezpracovaným vstupůmgetText() nebo MASK_ALLOW_RAW použí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');
  • 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