ADR-004 - Architettura Sistema Sicurezza
ADR-004: Architettura Sistema Sicurezza
Sezione intitolata “ADR-004: Architettura Sistema Sicurezza”Architettura di sicurezza completa per XOOPS CMS che protegge dalle minacce moderne.
Accettato - Livello di sicurezza core dal XOOPS 2.5
Contesto
Sezione intitolata “Contesto”Dichiarazione del Problema
Sezione intitolata “Dichiarazione del Problema”XOOPS ha bisogno di un sistema di sicurezza robusto che:
- Proteggi dalle vulnerabilità web comuni (OWASP Top 10)
- Fornisci controllo permessi granulare sui moduli
- Abilita autenticazione utente sicura con standard moderni
- Previeni violazioni dati e accesso non autorizzato
- Supporta controllo accesso multi-livello (admin, moderatore, utente, ospite)
- Si integra con tutti i moduli senza problemi
Minacce Attuali
Sezione intitolata “Minacce Attuali”Gli attacchi web moderni includono:
- Iniezione SQL - SQL malevolo nell’input utente
- XSS (Cross-Site Scripting) - JavaScript iniettato nelle pagine
- CSRF (Cross-Site Request Forgery) - Invii modulo non autorizzati
- Bypass autenticazione - Gestione sessione/password debole
- Bypass autorizzazione - Escalation privilegi
- Esposizione dati - Dati sensibili in URL, log o cache
Requisiti Sicurezza XOOPS
Sezione intitolata “Requisiti Sicurezza XOOPS”- Autenticazione utente e gestione sessione
- Controllo accesso basato su ruolo (RBAC)
- Sistema permessi per moduli e oggetti
- Validazione input e output escaping
- Protezione contro attacchi comuni
- Logging audit di eventi di sicurezza
- Gestione password sicura
- Protezione token CSRF
Decisione
Sezione intitolata “Decisione”Architettura Sicurezza Core
Sezione intitolata “Architettura Sicurezza Core”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 --> LComponenti Sicurezza
Sezione intitolata “Componenti Sicurezza”1. Sistema Autenticazione
Sezione intitolata “1. Sistema Autenticazione”Processo Login Utente:
<?php// 1. Valida credenziali$user = $userHandler->findByLogin($username);if (!$user || !password_verify($password, $user->getVar('pass'))) { throw new AuthenticationException('Invalid credentials');}
// 2. Controlla se account è attivoif (!$user->getVar('uactive')) { throw new AuthenticationException('Account inactive');}
// 3. Crea sessione sicurasession_regenerate_id(true);$_SESSION['uid'] = $user->getVar('uid');$_SESSION['token'] = bin2hex(random_bytes(32));$_SESSION['created'] = time();
// 4. Registra il login$this->auditLog('USER_LOGIN', $user->getVar('uid'));Sicurezza Password:
<?php// Usa password_hash (non MD5 o SHA1)$hashed = password_hash($password, PASSWORD_BCRYPT, [ 'cost' => 12, // Costo alto = brute force lento]);
// Verifica passwordif (!password_verify($inputPassword, $hashed)) { throw new Exception('Invalid password');}
// Rehash se algoritmo o costo è cambiatoif (password_needs_rehash($hashed, PASSWORD_BCRYPT, ['cost' => 12])) { $newHash = password_hash($password, PASSWORD_BCRYPT, ['cost' => 12]); $user->setVar('pass', $newHash); $userHandler->insert($user);}2. Gestione Sessione
Sezione intitolata “2. Gestione Sessione”Gestione Sessione Sicura:
<?php// Configurazione sessioneini_set('session.cookie_httponly', true); // Nessun accesso JSini_set('session.cookie_secure', true); // Solo HTTPSini_set('session.cookie_samesite', 'Strict'); // Protezione CSRFini_set('session.gc_maxlifetime', 3600); // Timeout 1 oraini_set('session.sid_length', 64); // ID sessione 64-char
// Valida sessionefunction validateSession() { // Controlla timeout if (time() - $_SESSION['created'] > 3600) { session_destroy(); throw new SessionExpiredException(); }
// Valida user agent (previeni session hijacking) if ($_SESSION['user_agent'] !== $_SERVER['HTTP_USER_AGENT']) { throw new SessionInvalidException(); }
// Valida IP (opzionale, può essere troppo severo) if (!in_array($_SERVER['REMOTE_ADDR'], $_SESSION['ips'])) { $_SESSION['ips'][] = $_SERVER['REMOTE_ADDR']; }}3. Autorizzazione (RBAC)
Sezione intitolata “3. Autorizzazione (RBAC)”Controllo Accesso Basato su Ruolo:
<?phpclass XoopsUser { public function hasPermission(string $permissionName): bool { // Ottieni gruppi utente $groups = $this->getGroups();
// Controlla se un gruppo ha permesso foreach ($groups as $groupId) { if ($this->checkGroupPermission($groupId, $permissionName)) { return true; } }
return false; }
/** * Gruppi utente e loro permessi * Admin: Accesso completo * Moderator: Gestione contenuti * User: Crea contenuti propri * Guest: Accesso solo lettura */ private function checkGroupPermission(int $groupId, string $permission): bool { $permissions = [ 1 => ['admin_access'], // Gruppo Admin 2 => ['moderate_content', 'edit_own'], // Gruppo Moderator 3 => ['create_content', 'edit_own'], // Gruppo User 4 => [], // Gruppo Guest (no permissions) ];
return in_array($permission, $permissions[$groupId] ?? []); }}4. Validazione Input
Sezione intitolata “4. Validazione Input”Previeni Iniezione SQL e Errori Tipo:
<?php// Usa sempre prepared statement$sql = 'SELECT * FROM users WHERE id = ?';$result = $db->query($sql, [$userId]); // ✅ Sicuro
// Validazione inputfunction 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), ];}
// Classe Safe Input XOOPS$safe = \Xmf\Request::getHtmlRequest('var_name', '');$int = \Xmf\Request::getInt('page', 1);5. Output Escaping
Sezione intitolata “5. Output Escaping”Previeni Attacchi XSS:
<?php// In template PHPecho htmlspecialchars($userInput, ENT_QUOTES, 'UTF-8');
// In template Smarty (escaping automatico)<{$user_input}> {* Escaped di default *}<{$html|escape:false}> {* Solo quando necessario *}
// Contesto JavaScript<script>var message = "<{$userMessage|escape:'javascript'}>";</script>
// Contesto URL<a href="<{$url|escape:'url'}>">Link</a>6. Protezione CSRF
Sezione intitolata “6. Protezione CSRF”Prevenzione Cross-Site Request Forgery:
<?php// Genera token CSRFsession_start();if (empty($_SESSION['csrf_token'])) { $_SESSION['csrf_token'] = bin2hex(random_bytes(32));}
// In form<form method="POST"> <input type="hidden" name="csrf_token" value="<{$csrf_token}>"> <button type="submit">Submit</button></form>
// Valida tokenif ($_SERVER['REQUEST_METHOD'] === 'POST') { if (hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'] ?? '')) { // Processa form } else { throw new InvalidTokenException('CSRF token invalid'); }}Conseguenze
Sezione intitolata “Conseguenze”Effetti Positivi
Sezione intitolata “Effetti Positivi”- Protezione Completa - Copre classi di vulnerabilità principali
- Sicurezza a Livelli - Molteplici livelli di difesa
- RBAC Flessibile - Controllo permessi fine-grained
- Traccia Audit - Traccia eventi di sicurezza
- Standard Industria - Si allinea con raccomandazioni OWASP
- Integrazione Moduli - Facile per i moduli di usare API sicurezza
Effetti Negativi
Sezione intitolata “Effetti Negativi”- Complessità - Più codice e configurazione necessaria
- Prestazioni - Hashing e validazione aggiungono overhead
- Esperienza Utente - La sicurezza è a volte scomoda
- Manutenzione - Richiede aggiornamenti di sicurezza continui
- Training Richiesto - Gli sviluppatori devono seguire le pratiche
Rischi e Mitigazioni
Sezione intitolata “Rischi e Mitigazioni”| Rischio | Gravità | Mitigazione |
|---|---|---|
| Sviluppatore ignora sicurezza | Alta | Code review, formazione sicurezza |
| Nuove vulnerabilità scoperte | Media | Audit di sicurezza regolari, aggiornamenti |
| Impatto prestazioni | Bassa | Ottimizza percorsi caldi, caching |
| Permessi eccessivamente complessi | Media | Documentazione chiara, esempi |
Best Practice Sicurezza
Sezione intitolata “Best Practice Sicurezza”Per Sviluppatori Moduli
Sezione intitolata “Per Sviluppatori Moduli”<?php// ✅ FARE: Usa prepared statement$result = $db->prepare('SELECT * FROM table WHERE id = ?')->execute([$id]);
// ❌ NON FARE: Concatena query$result = $db->query("SELECT * FROM table WHERE id = $id");
// ✅ FARE: Esegui output escapeecho htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8');
// ❌ NON FARE: Restituisci dati utente grezzoecho $user_input;
// ✅ FARE: Controlla permessiif (!$user->hasPermission('edit_content')) { throw new PermissionException();}
// ❌ NON FARE: Confida nei ruoli utente direttamenteif ($_POST['is_admin']) { // Rendi utente admin - SECURITY HOLE!}
// ✅ FARE: Valida tipi input$page = (int)$_GET['page'];
// ❌ NON FARE: Usa valori non fiduciosi direttamente$sql .= " LIMIT " . $_GET['limit'];Alternative Considerate
Sezione intitolata “Alternative Considerate”OAuth/OpenID Connect
Sezione intitolata “OAuth/OpenID Connect”Perché non scelto inizialmente: Troppo complesso per ambiente shared hosting, ma buono per futura integrazione con sistemi auth esterni.
Autenticazione Due Fattori (2FA)
Sezione intitolata “Autenticazione Due Fattori (2FA)”Stato: Accettato come estensione, non requisito core, vedi ADR-006
HTTP-only Session Cookie
Sezione intitolata “HTTP-only Session Cookie”Stato: Implementato - previene accesso JavaScript ai dati sessione
Decisioni Correlate
Sezione intitolata “Decisioni Correlate”- ADR-001: Architettura Modulare - I moduli implementano sicurezza
- ADR-005: Sistema Permessi Modulo
- ADR-006: Autenticazione Due Fattori (futuro)
Riferimenti
Sezione intitolata “Riferimenti”Standard Sicurezza
Sezione intitolata “Standard Sicurezza”Sicurezza PHP
Sezione intitolata “Sicurezza PHP”Strumenti
Sezione intitolata “Strumenti”Checklist Implementazione
Sezione intitolata “Checklist Implementazione”- Sistema autenticazione utente
- Gestione sessione
- Password hashing (bcrypt)
- Controllo accesso basato su ruolo
- Permessi modulo
- Framework validazione input
- Output escaping (PHP + Smarty)
- Protezione token CSRF
- Logging audit sicurezza
- Rate limiting
- Header di sicurezza
Cronologia Versioni
Sezione intitolata “Cronologia Versioni”| Versione | Data | Modifiche |
|---|---|---|
| 1.0.0 | 2024-01-28 | Documento iniziale |
#xoops #adr #security #architecture #authentication #authorization #rbac