Bỏ qua để đến nội dung

Yêu cầu XMF

Xmf\Request class cung cấp quyền truy cập có kiểm soát vào các biến yêu cầu HTTP với chức năng dọn dẹp và chuyển đổi loại tích hợp sẵn. Theo mặc định, nó bảo vệ chống lại các thao tác tiêm có thể gây hại trong khi tuân thủ đầu vào với các loại được chỉ định.

Xử lý yêu cầu là một trong những khía cạnh quan trọng nhất về bảo mật trong phát triển web. Yêu cầu XMF class:

  • Tự động vệ sinh đầu vào để ngăn chặn các cuộc tấn công XSS
  • Cung cấp các trình truy cập an toàn kiểu cho các kiểu dữ liệu phổ biến
  • Hỗ trợ nhiều nguồn yêu cầu (GET, POST, COOKIE, v.v.)
  • Cung cấp khả năng xử lý giá trị mặc định nhất quán
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');

Trả về phương thức yêu cầu HTTP cho yêu cầu hiện tại.

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

Phương thức cốt lõi mà hầu hết các phương thức get*() khác gọi ra. Tìm nạp và trả về một biến được đặt tên từ dữ liệu yêu cầu.

Thông số:

  • $name - Tên biến cần tìm nạp
  • $default - Giá trị mặc định nếu biến không tồn tại
  • $hash - Mã băm nguồn: GET, POST, FILES, COOKIE, ENV, SERVER, METHOD hoặc REQUEST (mặc định)
  • $type - Kiểu dữ liệu để làm sạch (xem các loại FilterInput bên dưới)
  • $mask - Bitmask cho các tùy chọn làm sạch

Giá trị mặt nạ:

Mặt nạ HằngHiệu ứng
MASK_NO_TRIMKhông cắt bớt khoảng trắng ở đầu/cuối
MASK_ALLOW_RAWBỏ qua việc dọn dẹp, cho phép nhập liệu thô
MASK_ALLOW_HTMLCho phép một bộ đánh dấu HTML “an toàn” có giới hạn
// 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);

Trả về một giá trị số nguyên. Chỉ cho phép chữ số.

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

Trả về một giá trị float. Chỉ cho phép chữ số và dấu chấm.

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

Trả về một giá trị boolean.

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

Trả về một chuỗi chỉ có các chữ cái và dấu gạch dưới [A-Za-z_].

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

Trả về chuỗi lệnh chỉ có [A-Za-z0-9.-_], buộc phải viết thường.

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

Trả về một chuỗi đã được làm sạch với mã HTML bị loại bỏ (trừ khi bị ghi đè bởi mặt nạ).

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

Trả về một mảng, được xử lý đệ quy để loại bỏ XSS và mã xấu.

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

Trả về văn bản thô mà không cần làm sạch. Sử dụng một cách thận trọng.

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

Trả về một trang web đã được xác thực URL (chỉ các lược đồ tương đối, http hoặc https).

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

Trả về một hệ thống tập tin hoặc đường dẫn web đã được xác thực.

$filePath = Request::getPath('file', '');
```### nhậnEmail($name, $default, $hash)
Trả về địa chỉ email được xác thực hoặc mặc định.
```php
$email = Request::getEmail('email', '');
$contactEmail = Request::getEmail('contact', 'default@example.com');

Trả về địa chỉ IPv4 hoặc IPv6 đã được xác thực.

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

Trả về giá trị tiêu đề yêu cầu HTTP.

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

Kiểm tra xem một biến có tồn tại trong hàm băm được chỉ định hay không.

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

Đặt một biến trong hàm băm được chỉ định. Trả về giá trị trước đó hoặc null.

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

Trả về bản sao sạch của toàn bộ mảng băm.

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

Đặt nhiều biến từ một mảng.

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

Yêu cầu class sử dụng Xmf\FilterInput để làm sạch. Các loại bộ lọc có sẵn:

LoạiMô tả
ALPHANUM / ALNUMChỉ chữ và số
MảngLàm sạch đệ quy từng phần tử
CƠ SỞ64Chuỗi mã hóa Base64
BOOLEAN / BOOLĐúng hay sai
CMDLệnh - A-Z, 0-9, gạch dưới, dấu gạch ngang, dấu chấm (chữ thường)
EMAILĐịa chỉ email hợp lệ
PHAO / NHÂN ĐÔISố dấu phẩy động
INTEGER / INTGiá trị nguyên
IPĐịa chỉ IP hợp lệ
ĐƯỜNGHệ thống tập tin hoặc đường dẫn web
CHUỖIChuỗi chung (mặc định)
TÊN NGƯỜI DÙNGĐịnh dạng tên người dùng
URL TRANGWeb URL
TỪChỉ các chữ cái A-Z và dấu gạch dưới
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. Luôn sử dụng các phương pháp dành riêng cho từng loại - Sử dụng getInt() cho ID, getEmail() cho email, v.v.

  2. Cung cấp các giá trị mặc định hợp lý - Không bao giờ cho rằng đầu vào tồn tại

  3. Xác thực sau khi khử trùng - Quá trình khử trùng sẽ loại bỏ dữ liệu xấu, quá trình xác thực đảm bảo dữ liệu chính xác

  4. Sử dụng hàm băm thích hợp - Chỉ định POST cho dữ liệu biểu mẫu, GET cho tham số truy vấn

  5. Tránh nhập liệu thô - Chỉ sử dụng getText() hoặc MASK_ALLOW_RAW khi thực sự cần thiết

// Good - type-specific with default
$id = Request::getInt('id', 0);
// Bad - using getString for numeric data
$id = (int) Request::getString('id', '0');
  • Bắt đầu với XMF - Các khái niệm cơ bản về XMF
  • XMF-Module-Helper - Trình trợ giúp mô-đun class
  • ../XMF-Framework - Tổng quan về khung

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