ADR-004 - สถาปัตยกรรมระบบความปลอดภัย
ADR-004: สถาปัตยกรรมระบบความปลอดภัย
หัวข้อที่มีชื่อว่า “ADR-004: สถาปัตยกรรมระบบความปลอดภัย”สถาปัตยกรรมความปลอดภัยที่ครอบคลุมสำหรับ XOOPS CMS การป้องกันภัยคุกคามสมัยใหม่
ยอมรับ - ชั้นความปลอดภัยหลักตั้งแต่ XOOPS 2.5
คำชี้แจงปัญหา
หัวข้อที่มีชื่อว่า “คำชี้แจงปัญหา”XOOPS ต้องการระบบรักษาความปลอดภัยที่แข็งแกร่งซึ่ง:
- ป้องกันช่องโหว่บนเว็บทั่วไป (OWASP 10 อันดับแรก)
- ให้การควบคุมสิทธิ์แบบละเอียด ทั่วทั้งโมดูล
- เปิดใช้งานการตรวจสอบผู้ใช้ที่ปลอดภัย ด้วยมาตรฐานที่ทันสมัย
- ป้องกันการละเมิดข้อมูล และการเข้าถึงโดยไม่ได้รับอนุญาต
- รองรับการควบคุมการเข้าถึงหลายระดับ (ผู้ดูแลระบบ ผู้ดูแล ผู้ใช้ แขก)
- บูรณาการกับโมดูลทั้งหมด ได้อย่างราบรื่น
ภัยคุกคามในปัจจุบัน
หัวข้อที่มีชื่อว่า “ภัยคุกคามในปัจจุบัน”การโจมตีทางเว็บสมัยใหม่ได้แก่:
- SQL การฉีด - SQL ที่เป็นอันตรายในการป้อนข้อมูลของผู้ใช้
- XSS (การเขียนสคริปต์ข้ามไซต์) - แทรก JavaScript ในหน้าเว็บ
- CSRF (การปลอมแปลงคำขอข้ามไซต์) - การส่งแบบฟอร์มที่ไม่ได้รับอนุญาต
- บายพาสการรับรองความถูกต้อง - การจัดการเซสชั่น/รหัสผ่านที่อ่อนแอ
- บายพาสการอนุญาต - การเพิ่มระดับสิทธิ์
- การเปิดเผยข้อมูล - ข้อมูลที่ละเอียดอ่อนใน URL บันทึก หรือแคช
XOOPS ข้อกำหนดด้านความปลอดภัย
หัวข้อที่มีชื่อว่า “XOOPS ข้อกำหนดด้านความปลอดภัย”- การตรวจสอบสิทธิ์ผู้ใช้และการจัดการเซสชัน
- การควบคุมการเข้าถึงตามบทบาท (RBAC)
- ระบบการอนุญาตสำหรับโมดูลและวัตถุ
- การตรวจสอบอินพุตและการหลบหนีเอาต์พุต
- การป้องกันการโจมตีทั่วไป
- ตรวจสอบการบันทึกเหตุการณ์ด้านความปลอดภัย
- การจัดการรหัสผ่านที่ปลอดภัย
- การป้องกันโทเค็น CSRF
การตัดสินใจ
หัวข้อที่มีชื่อว่า “การตัดสินใจ”สถาปัตยกรรมความปลอดภัยหลัก
หัวข้อที่มีชื่อว่า “สถาปัตยกรรมความปลอดภัยหลัก”mermaidgraph 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ส่วนประกอบด้านความปลอดภัย
หัวข้อที่มีชื่อว่า “ส่วนประกอบด้านความปลอดภัย”1. ระบบยืนยันตัวตน
หัวข้อที่มีชื่อว่า “1. ระบบยืนยันตัวตน”ขั้นตอนการเข้าสู่ระบบของผู้ใช้:
<?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 activeif (!$user->getVar('uactive')) { throw new AuthenticationException('Account inactive');}
// 3. Create secure sessionsession_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 passwordif (!password_verify($inputPassword, $hashed)) { throw new Exception('Invalid password');}
// Rehash if algorithm or cost changedif (password_needs_rehash($hashed, PASSWORD_BCRYPT, ['cost' => 12])) { $newHash = password_hash($password, PASSWORD_BCRYPT, ['cost' => 12]); $user->setVar('pass', $newHash); $userHandler->insert($user);}2. การจัดการเซสชัน
หัวข้อที่มีชื่อว่า “2. การจัดการเซสชัน”การจัดการเซสชันที่ปลอดภัย:
<?php// Session configurationini_set('session.cookie_httponly', true); // No JS accessini_set('session.cookie_secure', true); // HTTPS onlyini_set('session.cookie_samesite', 'Strict'); // CSRF protectionini_set('session.gc_maxlifetime', 3600); // 1 hour timeoutini_set('session.sid_length', 64); // 64-char session ID
// Validate sessionfunction 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']; }}3. การอนุญาต (RBAC)
หัวข้อที่มีชื่อว่า “3. การอนุญาต (RBAC)”การควบคุมการเข้าถึงตามบทบาท:
<?phpclass 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] ?? []); }}4. การตรวจสอบอินพุต
หัวข้อที่มีชื่อว่า “4. การตรวจสอบอินพุต”ป้องกัน SQL ข้อผิดพลาดในการฉีดและประเภท:
<?php// Always use prepared statements$sql = 'SELECT * FROM users WHERE id = ?';$result = $db->query($sql, [$userId]); // ✅ Safe
// Input validationfunction 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);5. การหลบหนีเอาต์พุต
หัวข้อที่มีชื่อว่า “5. การหลบหนีเอาต์พุต”ป้องกันการโจมตี XSS:
<?php// In PHP templatesecho 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>6. CSRF การป้องกัน
หัวข้อที่มีชื่อว่า “6. CSRF การป้องกัน”การป้องกันการปลอมแปลงคำขอข้ามไซต์:
<?php// Generate CSRF tokensession_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 tokenif ($_SERVER['REQUEST_METHOD'] === 'POST') { if (hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'] ?? '')) { // Process form } else { throw new InvalidTokenException('CSRF token invalid'); }}ผลที่ตามมา
หัวข้อที่มีชื่อว่า “ผลที่ตามมา”ผลเชิงบวก
หัวข้อที่มีชื่อว่า “ผลเชิงบวก”- การป้องกันที่ครอบคลุม - ครอบคลุมประเภทช่องโหว่ที่สำคัญ
- การรักษาความปลอดภัยแบบหลายชั้น - การป้องกันหลายชั้น
- ยืดหยุ่น RBAC - การควบคุมการอนุญาตอย่างละเอียด
- เส้นทางการตรวจสอบ - ติดตามเหตุการณ์ด้านความปลอดภัย
- มาตรฐานอุตสาหกรรม - สอดคล้องกับคำแนะนำ OWASP
- การรวมโมดูล - ง่ายสำหรับโมดูลในการใช้ API ความปลอดภัย
ผลกระทบเชิงลบ
หัวข้อที่มีชื่อว่า “ผลกระทบเชิงลบ”- ความซับซ้อน - จำเป็นต้องมีโค้ดและการกำหนดค่าเพิ่มเติม
- ประสิทธิภาพ - การแฮชและการตรวจสอบความถูกต้องเพิ่มค่าใช้จ่าย
- ประสบการณ์ผู้ใช้ - บางครั้งการรักษาความปลอดภัยก็ไม่สะดวก
- การบำรุงรักษา - ต้องมีการอัปเดตความปลอดภัยอย่างต่อเนื่อง
- ต้องมีการฝึกอบรม - นักพัฒนาจะต้องปฏิบัติตามแนวทางปฏิบัติ
ความเสี่ยงและการบรรเทาผลกระทบ
หัวข้อที่มีชื่อว่า “ความเสี่ยงและการบรรเทาผลกระทบ”| ความเสี่ยง | ความรุนแรง | การบรรเทาผลกระทบ |
|---|---|---|
| นักพัฒนาละเลยความปลอดภัย | สูง | การตรวจสอบโค้ด การฝึกอบรมด้านความปลอดภัย |
| ค้นพบช่องโหว่ใหม่ | ปานกลาง | การตรวจสอบความปลอดภัย การอัปเดตเป็นประจำ |
| ผลกระทบต่อประสิทธิภาพ | ต่ำ | ปรับเส้นทางลัดให้เหมาะสม, แคช |
| สิทธิ์ที่ซับซ้อนมากเกินไป | ปานกลาง | เอกสารชัดเจน ตัวอย่าง |
แนวทางปฏิบัติที่ดีที่สุดด้านความปลอดภัย
หัวข้อที่มีชื่อว่า “แนวทางปฏิบัติที่ดีที่สุดด้านความปลอดภัย”สำหรับนักพัฒนาโมดูล
หัวข้อที่มีชื่อว่า “สำหรับนักพัฒนาโมดูล”<?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 outputecho htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8');
// ❌ DON'T: Output raw user dataecho $user_input;
// ✅ DO: Check permissionsif (!$user->hasPermission('edit_content')) { throw new PermissionException();}
// ❌ DON'T: Trust user roles directlyif ($_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'];พิจารณาทางเลือกอื่นแล้ว
หัวข้อที่มีชื่อว่า “พิจารณาทางเลือกอื่นแล้ว”เชื่อมต่อ OAuth/OpenID
หัวข้อที่มีชื่อว่า “เชื่อมต่อ OAuth/OpenID”ทำไมไม่เลือกตั้งแต่แรก: ซับซ้อนเกินไปสำหรับสภาพแวดล้อมโฮสติ้งที่ใช้ร่วมกัน แต่ดีสำหรับการผสานรวมกับระบบการตรวจสอบสิทธิ์ภายนอกในอนาคต
การรับรองความถูกต้องด้วยสองปัจจัย (2FA)
หัวข้อที่มีชื่อว่า “การรับรองความถูกต้องด้วยสองปัจจัย (2FA)”สถานะ: ได้รับการยอมรับว่าเป็นส่วนขยาย ไม่ใช่ข้อกำหนดหลัก ดู ADR-006
HTTP-คุกกี้เซสชันเท่านั้น
หัวข้อที่มีชื่อว่า “HTTP-คุกกี้เซสชันเท่านั้น”สถานะ: ใช้งานแล้ว - ป้องกันการเข้าถึงข้อมูลเซสชัน JavaScript
การตัดสินใจที่เกี่ยวข้อง
หัวข้อที่มีชื่อว่า “การตัดสินใจที่เกี่ยวข้อง”- ADR-001: สถาปัตยกรรมโมดูลาร์ - โมดูลใช้การรักษาความปลอดภัย
- ADR-005: ระบบการอนุญาตโมดูล
- ADR-006: การรับรองความถูกต้องด้วยสองปัจจัย (ในอนาคต)
อ้างอิง
หัวข้อที่มีชื่อว่า “อ้างอิง”มาตรฐานความปลอดภัย
หัวข้อที่มีชื่อว่า “มาตรฐานความปลอดภัย”PHP ความปลอดภัย
หัวข้อที่มีชื่อว่า “PHP ความปลอดภัย”เครื่องมือ
หัวข้อที่มีชื่อว่า “เครื่องมือ”รายการตรวจสอบการดำเนินการ
หัวข้อที่มีชื่อว่า “รายการตรวจสอบการดำเนินการ”- ระบบตรวจสอบสิทธิ์ผู้ใช้
- การจัดการเซสชัน
- การแฮชรหัสผ่าน (bcrypt)
- การควบคุมการเข้าถึงตามบทบาท
- สิทธิ์ของโมดูล
- กรอบการตรวจสอบอินพุต
- การหลบหนีเอาต์พุต (PHP + Smarty)
- CSRF การป้องกันโทเค็น
- การบันทึกการตรวจสอบความปลอดภัย
- การจำกัดอัตรา
- ส่วนหัวการรักษาความปลอดภัย
ประวัติเวอร์ชัน
หัวข้อที่มีชื่อว่า “ประวัติเวอร์ชัน”| เวอร์ชั่น | วันที่ | การเปลี่ยนแปลง |
|---|---|---|
| 1.0.0 | 2024-01-28 | เอกสารเริ่มต้น |
#xoops #adr #security #architecture #authentication #authorization #rbac