ข้ามไปยังเนื้อหา

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'

วิธีการหลักที่วิธี get*() อื่นๆ ส่วนใหญ่เรียกใช้ ดึงข้อมูลและส่งคืนตัวแปรที่มีชื่อจากข้อมูลคำขอ

พารามิเตอร์:

  • $name - ชื่อตัวแปรที่จะดึงข้อมูล
  • $default - ค่าเริ่มต้นหากไม่มีตัวแปรอยู่
  • $hash - แหล่งที่มาของแฮช: GET, POST, FILES, COOKIE, ENV, SERVER, METHOD, หรือ REQUEST (ค่าเริ่มต้น)
  • $type - ประเภทข้อมูลสำหรับการทำความสะอาด (ดูประเภทตัวกรองอินพุตด้านล่าง)
  • $mask - Bitmask สำหรับตัวเลือกการทำความสะอาด

ค่ามาส์ก:

หน้ากากคงเอฟเฟกต์
MASK_NO_TRIMอย่าตัดช่องว่างนำหน้า/ต่อท้าย
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
}

ตั้งค่าตัวแปรในแฮชที่ระบุ ส่งคืนค่าก่อนหน้าหรือค่าว่าง

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

คลาสคำขอใช้ 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));
}
  1. ใช้วิธีการเฉพาะประเภทเสมอ - ใช้ getInt() สำหรับ ID, 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