Skip to content

ADR-004 - Seni Bina Sistem Keselamatan

ADR-004: Seni Bina Sistem Keselamatan> Seni bina keselamatan yang komprehensif untuk XOOPS CMS yang melindungi daripada ancaman moden.---

Section titled “ADR-004: Seni Bina Sistem Keselamatan> Seni bina keselamatan yang komprehensif untuk XOOPS CMS yang melindungi daripada ancaman moden.---”

StatusDiterima - Lapisan keselamatan teras sejak XOOPS 2.5---

Section titled “StatusDiterima - Lapisan keselamatan teras sejak XOOPS 2.5---”

Konteks### Pernyataan MasalahXOOPS memerlukan sistem keselamatan yang teguh yang:1. Melindungi daripada kelemahan web biasa (OWASP Top 10)

Section titled “Konteks### Pernyataan MasalahXOOPS memerlukan sistem keselamatan yang teguh yang:1. Melindungi daripada kelemahan web biasa (OWASP Top 10)”
  1. Menyediakan kawalan kebenaran berbutir merentas modul
  2. Mendayakan pengesahan pengguna selamat dengan piawaian moden
  3. Menghalang pelanggaran data dan akses tanpa kebenaran
  4. Menyokong kawalan akses berbilang peringkat (pentadbir, moderator, pengguna, tetamu)
  5. Bersepadu dengan semua modul dengan lancar### Ancaman SemasaSerangan web moden termasuk:- SQL Injection - SQL hasad dalam input pengguna
  • XSS (Skrip Merentas Tapak) - JavaScript yang disuntik dalam halaman
  • CSRF (Pemalsuan Permintaan Merentas Tapak) - Penyerahan borang tanpa kebenaran
  • Pintas pengesahan - Pengendalian session/password yang lemah
  • Pintas kebenaran - Peningkatan keistimewaan
  • Pendedahan data - Data sensitif dalam URL, log atau cache### XOOPS Keperluan Keselamatan1. Pengesahan pengguna dan pengurusan sesi
  1. Kawalan akses berasaskan peranan (RBAC)
  2. Sistem kebenaran untuk modul dan objek
  3. Pengesahan input dan keluaran melarikan diri
  4. Perlindungan terhadap serangan biasa
  5. Pengelogan audit kejadian keselamatan
  6. Pengendalian kata laluan selamat
  7. Perlindungan token 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

Komponen Keselamatan### 1. Sistem PengesahanProses Log Masuk Pengguna:

Section titled “Komponen Keselamatan### 1. Sistem PengesahanProses Log Masuk Pengguna:”
php
<?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'));

Keselamatan Kata Laluan:

php
<?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);
}

2. Pengurusan SesiPengendalian Sesi Selamat:

Section titled “2. Pengurusan SesiPengendalian Sesi Selamat:”
php
<?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'];
}
}

3. Keizinan (RBAC)Kawalan Akses Berasaskan Peranan:

Section titled “3. Keizinan (RBAC)Kawalan Akses Berasaskan Peranan:”
php
<?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] ?? []);
}
}

4. Pengesahan InputCegah SQL Injection dan Ralat Jenis:

Section titled “4. Pengesahan InputCegah SQL Injection dan Ralat Jenis:”
php
<?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);

5. Keluaran Melarikan DiriCegah Serangan XSS:

Section titled “5. Keluaran Melarikan DiriCegah Serangan XSS:”
php
<?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>

6. Perlindungan CSRFPencegahan Pemalsuan Permintaan Merentas Tapak:

Section titled “6. Perlindungan CSRFPencegahan Pemalsuan Permintaan Merentas Tapak:”
php
<?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');
}
}

Akibat### Kesan Positif1. Perlindungan Komprehensif - Meliputi kelas kelemahan utama

Section titled “Akibat### Kesan Positif1. Perlindungan Komprehensif - Meliputi kelas kelemahan utama”
  1. Keselamatan Berlapis - Pelbagai lapisan pertahanan
  2. Fleksibel RBAC - Kawalan kebenaran terperinci
  3. Jejak Audit - Jejaki peristiwa keselamatan
  4. Piawaian Industri - Sejajar dengan pengesyoran OWASP
  5. Penyatuan Modul - Mudah untuk modul menggunakan API keselamatan### Kesan Negatif1. Kerumitan - Lebih banyak kod dan konfigurasi diperlukan
  6. Prestasi - Hashing dan pengesahan menambah overhed
  7. Pengalaman Pengguna - Keselamatan kadangkala menyusahkan
  8. Penyelenggaraan - Memerlukan kemas kini keselamatan yang berterusan
  9. Latihan Diperlukan - Pemaju mesti mengikut amalan### Risiko dan Tebatan| Risiko | Keterukan | Mitigasi | |------|----------|-----------| | Pembangun mengabaikan keselamatan | Tinggi | Semakan kod, latihan keselamatan | | Kerentanan baharu ditemui | Sederhana | Audit keselamatan tetap, kemas kini | | Kesan prestasi | Rendah | Optimumkan laluan panas, caching | | Keizinan yang terlalu kompleks | Sederhana | Dokumentasi yang jelas, contoh |---

Amalan Terbaik Keselamatan### Untuk Pembangun Modul

Section titled “Amalan Terbaik Keselamatan### Untuk Pembangun Modul”
php
<?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'];

Alternatif Dipertimbangkan### OAuth/OpenID SambungMengapa tidak dipilih pada mulanya: Terlalu kompleks untuk persekitaran pengehosan dikongsi, tetapi bagus untuk penyepaduan masa hadapan dengan sistem pengesahan luaran.### Pengesahan Dua Faktor (2FA)Status: Diterima sebagai sambungan, bukan keperluan teras, lihat ADR-006### Kuki Sesi HTTP sahajaStatus: Dilaksanakan - menghalang akses JavaScript kepada data sesi---

Section titled “Alternatif Dipertimbangkan### OAuth/OpenID SambungMengapa tidak dipilih pada mulanya: Terlalu kompleks untuk persekitaran pengehosan dikongsi, tetapi bagus untuk penyepaduan masa hadapan dengan sistem pengesahan luaran.### Pengesahan Dua Faktor (2FA)Status: Diterima sebagai sambungan, bukan keperluan teras, lihat ADR-006### Kuki Sesi HTTP sahajaStatus: Dilaksanakan - menghalang akses JavaScript kepada data sesi---”

Keputusan Berkaitan- ADR-001: Seni Bina Modular - Modul melaksanakan keselamatan

Section titled “Keputusan Berkaitan- ADR-001: Seni Bina Modular - Modul melaksanakan keselamatan”
  • ADR-005: Sistem Kebenaran Modul
  • ADR-006: Pengesahan Dua Faktor (masa hadapan)---

Senarai Semak Perlaksanaan- [ ] Sistem pengesahan pengguna

Section titled “Senarai Semak Perlaksanaan- [ ] Sistem pengesahan pengguna”
  • Pengurusan sesi
  • Pencincangan kata laluan (bcrypt)
  • Kawalan capaian berasaskan peranan
  • Kebenaran modul
  • Rangka kerja pengesahan input
  • Keluaran melarikan diri (PHP + Smarty)
  • Perlindungan token CSRF
  • Pengelogan audit keselamatan
  • Mengehadkan kadar
  • Pengepala keselamatan---

Sejarah Versi| Versi | Tarikh | Perubahan |

Section titled “Sejarah Versi| Versi | Tarikh | Perubahan |”

|---------|------|---------| | 1.0.0 | 28-01-2024 | Dokumen awal |---

#XOOPS #adr #security #architecture #authentication #authorization #rbac