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

ADR-004 - สถาปัตยกรรมระบบความปลอดภัย

สถาปัตยกรรมความปลอดภัยที่ครอบคลุมสำหรับ XOOPS CMS การป้องกันภัยคุกคามสมัยใหม่


ยอมรับ - ชั้นความปลอดภัยหลักตั้งแต่ XOOPS 2.5


XOOPS ต้องการระบบรักษาความปลอดภัยที่แข็งแกร่งซึ่ง:

  1. ป้องกันช่องโหว่บนเว็บทั่วไป (OWASP 10 อันดับแรก)
  2. ให้การควบคุมสิทธิ์แบบละเอียด ทั่วทั้งโมดูล
  3. เปิดใช้งานการตรวจสอบผู้ใช้ที่ปลอดภัย ด้วยมาตรฐานที่ทันสมัย
  4. ป้องกันการละเมิดข้อมูล และการเข้าถึงโดยไม่ได้รับอนุญาต
  5. รองรับการควบคุมการเข้าถึงหลายระดับ (ผู้ดูแลระบบ ผู้ดูแล ผู้ใช้ แขก)
  6. บูรณาการกับโมดูลทั้งหมด ได้อย่างราบรื่น

การโจมตีทางเว็บสมัยใหม่ได้แก่:

  • SQL การฉีด - SQL ที่เป็นอันตรายในการป้อนข้อมูลของผู้ใช้
  • XSS (การเขียนสคริปต์ข้ามไซต์) - แทรก JavaScript ในหน้าเว็บ
  • CSRF (การปลอมแปลงคำขอข้ามไซต์) - การส่งแบบฟอร์มที่ไม่ได้รับอนุญาต
  • บายพาสการรับรองความถูกต้อง - การจัดการเซสชั่น/รหัสผ่านที่อ่อนแอ
  • บายพาสการอนุญาต - การเพิ่มระดับสิทธิ์
  • การเปิดเผยข้อมูล - ข้อมูลที่ละเอียดอ่อนใน URL บันทึก หรือแคช
  1. การตรวจสอบสิทธิ์ผู้ใช้และการจัดการเซสชัน
  2. การควบคุมการเข้าถึงตามบทบาท (RBAC)
  3. ระบบการอนุญาตสำหรับโมดูลและวัตถุ
  4. การตรวจสอบอินพุตและการหลบหนีเอาต์พุต
  5. การป้องกันการโจมตีทั่วไป
  6. ตรวจสอบการบันทึกเหตุการณ์ด้านความปลอดภัย
  7. การจัดการรหัสผ่านที่ปลอดภัย
  8. การป้องกันโทเค็น CSRF

mermaid
graph TB
subgraph "Authentication Layer"
A["User Authentication<br/>(Login/Sessions)"]
B["Session Management<br/>(Tokens/Cookies)"]
C["Password Security<br/>(Hashing/Salts)"]
end
subgraph "Authorization Layer"
D["Role Management<br/>(Admin/User/Guest)"]
E["Permission System<br/>(Module-level)"]
F["Object Permissions<br/>(Item-level)"]
end
subgraph "Protection Layer"
G["Input Validation<br/>(Type/Format)"]
H["Output Escaping<br/>(HTML/JavaScript)"]
I["CSRF Protection<br/>(Token Validation)"]
end
subgraph "Monitoring Layer"
J["Audit Logging<br/>(Security Events)"]
K["Rate Limiting<br/>(Brute Force)"]
L["Intrusion Detection<br/>(Suspicious Activity)"]
end
A --> B
A --> C
D --> E
E --> F
G --> I
H --> I
J --> K
K --> L

ขั้นตอนการเข้าสู่ระบบของผู้ใช้:

<?php
// 1. Validate credentials
$user = $userHandler->findByLogin($username);
if (!$user || !password_verify($password, $user->getVar('pass'))) {
throw new AuthenticationException('Invalid credentials');
}
// 2. Check if account is active
if (!$user->getVar('uactive')) {
throw new AuthenticationException('Account inactive');
}
// 3. Create secure session
session_regenerate_id(true);
$_SESSION['uid'] = $user->getVar('uid');
$_SESSION['token'] = bin2hex(random_bytes(32));
$_SESSION['created'] = time();
// 4. Log the login
$this->auditLog('USER_LOGIN', $user->getVar('uid'));

ความปลอดภัยของรหัสผ่าน:

<?php
// Use password_hash (not MD5 or SHA1)
$hashed = password_hash($password, PASSWORD_BCRYPT, [
'cost' => 12, // High cost = slow brute force
]);
// Verify password
if (!password_verify($inputPassword, $hashed)) {
throw new Exception('Invalid password');
}
// Rehash if algorithm or cost changed
if (password_needs_rehash($hashed, PASSWORD_BCRYPT, ['cost' => 12])) {
$newHash = password_hash($password, PASSWORD_BCRYPT, ['cost' => 12]);
$user->setVar('pass', $newHash);
$userHandler->insert($user);
}

การจัดการเซสชันที่ปลอดภัย:

<?php
// Session configuration
ini_set('session.cookie_httponly', true); // No JS access
ini_set('session.cookie_secure', true); // HTTPS only
ini_set('session.cookie_samesite', 'Strict'); // CSRF protection
ini_set('session.gc_maxlifetime', 3600); // 1 hour timeout
ini_set('session.sid_length', 64); // 64-char session ID
// Validate session
function validateSession() {
// Check timeout
if (time() - $_SESSION['created'] > 3600) {
session_destroy();
throw new SessionExpiredException();
}
// Validate user agent (prevent session hijacking)
if ($_SESSION['user_agent'] !== $_SERVER['HTTP_USER_AGENT']) {
throw new SessionInvalidException();
}
// Validate IP (optional, can be too strict)
if (!in_array($_SERVER['REMOTE_ADDR'], $_SESSION['ips'])) {
$_SESSION['ips'][] = $_SERVER['REMOTE_ADDR'];
}
}

การควบคุมการเข้าถึงตามบทบาท:

<?php
class XoopsUser {
public function hasPermission(string $permissionName): bool
{
// Get user groups
$groups = $this->getGroups();
// Check if any group has permission
foreach ($groups as $groupId) {
if ($this->checkGroupPermission($groupId, $permissionName)) {
return true;
}
}
return false;
}
/**
* User groups and their permissions
* Admin: Full access
* Moderator: Content management
* User: Create own content
* Guest: Read-only access
*/
private function checkGroupPermission(int $groupId, string $permission): bool
{
$permissions = [
1 => ['admin_access'], // Admin group
2 => ['moderate_content', 'edit_own'], // Moderator group
3 => ['create_content', 'edit_own'], // User group
4 => [], // Guest group (no permissions)
];
return in_array($permission, $permissions[$groupId] ?? []);
}
}

ป้องกัน SQL ข้อผิดพลาดในการฉีดและประเภท:

<?php
// Always use prepared statements
$sql = 'SELECT * FROM users WHERE id = ?';
$result = $db->query($sql, [$userId]); // ✅ Safe
// Input validation
function validateUserInput(array $data): array
{
return [
'email' => filter_var($data['email'] ?? '', FILTER_VALIDATE_EMAIL),
'age' => filter_var($data['age'] ?? 0, FILTER_VALIDATE_INT),
'website' => filter_var($data['website'] ?? '', FILTER_VALIDATE_URL),
'title' => substr(trim($data['title'] ?? ''), 0, 255),
];
}
// XOOPS Safe Input class
$safe = \Xmf\Request::getHtmlRequest('var_name', '');
$int = \Xmf\Request::getInt('page', 1);

ป้องกันการโจมตี XSS:

<?php
// In PHP templates
echo htmlspecialchars($userInput, ENT_QUOTES, 'UTF-8');
// In Smarty templates (automatic escaping)
<{$user_input}> {* Escaped by default *}
<{$html|escape:false}> {* Only when needed *}
// JavaScript context
<script>
var message = "<{$userMessage|escape:'javascript'}>";
</script>
// URL context
<a href="<{$url|escape:'url'}>">Link</a>

การป้องกันการปลอมแปลงคำขอข้ามไซต์:

<?php
// Generate CSRF token
session_start();
if (empty($_SESSION['csrf_token'])) {
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}
// In forms
<form method="POST">
<input type="hidden" name="csrf_token" value="<{$csrf_token}>">
<button type="submit">Submit</button>
</form>
// Validate token
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'] ?? '')) {
// Process form
} else {
throw new InvalidTokenException('CSRF token invalid');
}
}

  1. การป้องกันที่ครอบคลุม - ครอบคลุมประเภทช่องโหว่ที่สำคัญ
  2. การรักษาความปลอดภัยแบบหลายชั้น - การป้องกันหลายชั้น
  3. ยืดหยุ่น RBAC - การควบคุมการอนุญาตอย่างละเอียด
  4. เส้นทางการตรวจสอบ - ติดตามเหตุการณ์ด้านความปลอดภัย
  5. มาตรฐานอุตสาหกรรม - สอดคล้องกับคำแนะนำ OWASP
  6. การรวมโมดูล - ง่ายสำหรับโมดูลในการใช้ API ความปลอดภัย
  1. ความซับซ้อน - จำเป็นต้องมีโค้ดและการกำหนดค่าเพิ่มเติม
  2. ประสิทธิภาพ - การแฮชและการตรวจสอบความถูกต้องเพิ่มค่าใช้จ่าย
  3. ประสบการณ์ผู้ใช้ - บางครั้งการรักษาความปลอดภัยก็ไม่สะดวก
  4. การบำรุงรักษา - ต้องมีการอัปเดตความปลอดภัยอย่างต่อเนื่อง
  5. ต้องมีการฝึกอบรม - นักพัฒนาจะต้องปฏิบัติตามแนวทางปฏิบัติ
ความเสี่ยงความรุนแรงการบรรเทาผลกระทบ
นักพัฒนาละเลยความปลอดภัยสูงการตรวจสอบโค้ด การฝึกอบรมด้านความปลอดภัย
ค้นพบช่องโหว่ใหม่ปานกลางการตรวจสอบความปลอดภัย การอัปเดตเป็นประจำ
ผลกระทบต่อประสิทธิภาพต่ำปรับเส้นทางลัดให้เหมาะสม, แคช
สิทธิ์ที่ซับซ้อนมากเกินไปปานกลางเอกสารชัดเจน ตัวอย่าง

<?php
// ✅ DO: Use prepared statements
$result = $db->prepare('SELECT * FROM table WHERE id = ?')->execute([$id]);
// ❌ DON'T: Concatenate queries
$result = $db->query("SELECT * FROM table WHERE id = $id");
// ✅ DO: Escape output
echo htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8');
// ❌ DON'T: Output raw user data
echo $user_input;
// ✅ DO: Check permissions
if (!$user->hasPermission('edit_content')) {
throw new PermissionException();
}
// ❌ DON'T: Trust user roles directly
if ($_POST['is_admin']) {
// Make user admin - SECURITY HOLE!
}
// ✅ DO: Validate input types
$page = (int)$_GET['page'];
// ❌ DON'T: Use untrusted values directly
$sql .= " LIMIT " . $_GET['limit'];

ทำไมไม่เลือกตั้งแต่แรก: ซับซ้อนเกินไปสำหรับสภาพแวดล้อมโฮสติ้งที่ใช้ร่วมกัน แต่ดีสำหรับการผสานรวมกับระบบการตรวจสอบสิทธิ์ภายนอกในอนาคต

สถานะ: ได้รับการยอมรับว่าเป็นส่วนขยาย ไม่ใช่ข้อกำหนดหลัก ดู ADR-006

สถานะ: ใช้งานแล้ว - ป้องกันการเข้าถึงข้อมูลเซสชัน JavaScript


  • ADR-001: สถาปัตยกรรมโมดูลาร์ - โมดูลใช้การรักษาความปลอดภัย
  • ADR-005: ระบบการอนุญาตโมดูล
  • ADR-006: การรับรองความถูกต้องด้วยสองปัจจัย (ในอนาคต)

  • OWASP ZAP - การทดสอบความปลอดภัย
  • Snyk - การสแกนช่องโหว่
  • SonarQube - คุณภาพของโค้ด

  • ระบบตรวจสอบสิทธิ์ผู้ใช้
  • การจัดการเซสชัน
  • การแฮชรหัสผ่าน (bcrypt)
  • การควบคุมการเข้าถึงตามบทบาท
  • สิทธิ์ของโมดูล
  • กรอบการตรวจสอบอินพุต
  • การหลบหนีเอาต์พุต (PHP + Smarty)
  • CSRF การป้องกันโทเค็น
  • การบันทึกการตรวจสอบความปลอดภัย
  • การจำกัดอัตรา
  • ส่วนหัวการรักษาความปลอดภัย

เวอร์ชั่นวันที่การเปลี่ยนแปลง
1.0.02024-01-28เอกสารเริ่มต้น

#xoops #adr #security #architecture #authentication #authorization #rbac