Перейти до вмісту

XMF Запит

Клас XMF\Request забезпечує контрольований доступ до змінних запиту 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 - Хеш джерела: GET, POST, FILES, COOKIE, ENV, SERVER, METHOD або REQUEST (за замовчуванням)
  • $type - Тип даних для очищення (див. типи FilterInput нижче)
  • $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', '');

Повертає значення заголовка запиту HTTP.

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

Перевірте, чи існує змінна у вказаному хеші.

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

Установіть змінну в указаному хеші. Повертає попереднє значення або null.

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

Повертає очищену копію цілого хеш-масиву.

// 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Команда - 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()) {
// 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. Використовуйте відповідний хеш - укажіть 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