Skip to content

XMF Permintaan

Kelas XMF\Request menyediakan akses terkawal kepada pembolehubah permintaan HTTP dengan sanitasi terbina dalam dan penukaran jenis. Ia melindungi daripada suntikan yang berpotensi berbahaya secara lalai sambil mematuhi input kepada jenis tertentu.

Pengendalian permintaan ialah salah satu aspek pembangunan web yang paling kritikal keselamatan. Kelas XMF Permintaan:

  • Membersihkan input secara automatik untuk mengelakkan serangan XSS
  • Menyediakan pengakses jenis selamat untuk jenis data biasa
  • Menyokong berbilang sumber permintaan (GET, POST, COOKIE, dsb.)
  • Menawarkan pengendalian nilai lalai yang konsisten
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');

Mengembalikan kaedah permintaan HTTP untuk permintaan semasa.

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

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

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

Kaedah teras yang digunakan oleh kebanyakan kaedah get*() yang lain. Mengambil dan mengembalikan pembolehubah bernama daripada data permintaan.

Parameter:

  • $name - Nama boleh ubah untuk diambil
  • $default - Nilai lalai jika pembolehubah tidak wujud
  • $hash - Hash sumber: GET, POST, FILES, COOKIE, ENV, SERVER, 000,020 (default)
  • $type - Jenis data untuk pembersihan (lihat jenis Input Penapis di bawah)
  • $mask - Bitmask untuk pilihan pembersihan

Nilai Topeng:

Pemalar TopengKesan
MASK_NO_TRIMJangan potong leading/trailing ruang putih
MASK_ALLOW_RAWLangkau pembersihan, benarkan input mentah
MASK_ALLOW_HTMLBenarkan set “selamat” terhad bagi HTML markup
// 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);

Mengembalikan nilai integer. Hanya digit dibenarkan.

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

Mengembalikan nilai apungan. Hanya digit dan noktah dibenarkan.

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

Mengembalikan nilai boolean.

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

Mengembalikan rentetan dengan hanya huruf dan garis bawah [A-Za-z_].

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

Mengembalikan rentetan arahan dengan hanya [A-Za-z0-9.-_], terpaksa menggunakan huruf kecil.

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

Mengembalikan rentetan yang telah dibersihkan dengan kod HTML buruk dialih keluar (melainkan ditindih oleh topeng).

$title = Request::getString('title', '');
$description = Request::getString('description', '', 'POST');
// Allow some HTML
$content = Request::getString('content', '', 'POST', Request::MASK_ALLOW_HTML);

Mengembalikan tatasusunan, diproses secara rekursif untuk mengalih keluar XSS dan kod buruk.

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

Mengembalikan teks mentah tanpa pembersihan. Gunakan dengan berhati-hati.

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

Mengembalikan web yang disahkan URL (skim relatif, http atau https sahaja).

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

Mengembalikan sistem fail atau laluan web yang disahkan.

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

Mengembalikan alamat e-mel yang disahkan atau lalai.

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

Mengembalikan alamat IPv4 atau IPv6 yang disahkan.

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

Mengembalikan nilai pengepala permintaan HTTP.

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

Semak sama ada pembolehubah wujud dalam cincang yang ditentukan.

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

Tetapkan pembolehubah dalam cincang yang ditentukan. Mengembalikan nilai sebelumnya atau null.

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

Mengembalikan salinan keseluruhan tatasusunan cincang yang telah dibersihkan.

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

Menetapkan berbilang pembolehubah daripada tatasusunan.

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

Kelas Permintaan menggunakan XMF\FilterInput untuk pembersihan. Jenis penapis yang tersedia:

TaipPenerangan
ALPHANUM / ALNUMAlfanumerik sahaja
ARRAYBersihkan secara rekursif setiap elemen
BASE64Rentetan berkod Base64
BOOLEAN / BOOLBetul atau salah
CMDPerintah - A-Z, 0-9, garis bawah, sempang, noktah (huruf kecil)
EMAILAlamat e-mel yang sah
FLOAT / DOUBLENombor titik terapung
INTEGER / INTNilai integer
IPAlamat IP yang sah
PATHSistem fail atau laluan web
STRINGRentetan am (lalai)
USERNAMEFormat nama pengguna
WEBURLWeb URL
WORDHuruf A-Z dan garis bawah sahaja
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));
}
  1. Sentiasa gunakan kaedah khusus jenis - Gunakan getInt() untuk ID, getEmail() untuk e-mel, dsb.

  2. Berikan lalai yang wajar - Jangan sekali-kali menganggap input wujud

  3. Sahkan selepas sanitasi - Sanitasi membuang data yang tidak baik, pengesahan memastikan data yang betul

  4. Gunakan cincang yang sesuai - Tentukan POST untuk data borang, GET untuk parameter pertanyaan

  5. Elakkan input mentah - Hanya gunakan getText() atau MASK_ALLOW_RAW apabila benar-benar perlu

// Good - type-specific with default
$id = Request::getInt('id', 0);
// Bad - using getString for numeric data
$id = (int) Request::getString('id', '0');
  • Bermula-dengan-XMF - Konsep asas XMF
  • XMF-Modul-Helper - Kelas pembantu modul
  • ../XMF-Rangka Kerja - Gambaran keseluruhan rangka kerja

#XMF #request #security #input-validation #sanitization