Μετάβαση στο περιεχόμενο

ADR-004 - Αρχιτεκτονική Συστημάτων Ασφαλείας

ADR-004: Αρχιτεκτονική συστημάτων ασφαλείας

Ενότητα με τίτλο «ADR-004: Αρχιτεκτονική συστημάτων ασφαλείας»

Ολοκληρωμένη αρχιτεκτονική ασφαλείας για XOOPS CMS προστασία από σύγχρονες απειλές.


Αποδεκτό - Βασικό επίπεδο ασφαλείας από το XOOPS 2.5


Το XOOPS χρειάζεται ένα ισχυρό σύστημα ασφαλείας που:

  1. Προστατεύει από κοινά τρωτά σημεία ιστού (OWASP Top 10)
  2. Παρέχει λεπτομερή έλεγχο αδειών σε όλες τις μονάδες
  3. Επιτρέπει τον ασφαλή έλεγχο ταυτότητας χρήστη με σύγχρονα πρότυπα
  4. Αποτρέπει τις παραβιάσεις δεδομένων και τη μη εξουσιοδοτημένη πρόσβαση
  5. Υποστηρίζει έλεγχο πρόσβασης πολλαπλών επιπέδων (διαχειριστής, συντονιστής, χρήστης, επισκέπτης)
  6. Ενσωματώνεται με όλες τις μονάδες απρόσκοπτα

Οι σύγχρονες διαδικτυακές επιθέσεις περιλαμβάνουν:

  • SQL Έγχυση - Κακόβουλο SQL στην είσοδο χρήστη
  • XSS (Σενάρια μεταξύ τοποθεσιών) - Ένταξη JavaScript στις σελίδες
  • CSRF (Πλαστογραφία αιτήματος μεταξύ ιστοτόπων) - Μη εξουσιοδοτημένες υποβολές φορμών
  • Παράκαμψη ελέγχου ταυτότητας - Αδύναμος χειρισμός session/password
  • Παράκαμψη εξουσιοδότησης - Κλιμάκωση προνομίων
  • Εκθεση δεδομένων - Ευαίσθητα δεδομένα σε διευθύνσεις URL, αρχεία καταγραφής ή κρυφές μνήμες
  1. Έλεγχος ταυτότητας χρήστη και διαχείριση συνεδρίας
  2. Έλεγχος πρόσβασης βάσει ρόλων (RBAC)
  3. Σύστημα αδειών για μονάδες και αντικείμενα
  4. Επικύρωση εισόδου και διαφυγή εξόδου
  5. Προστασία από κοινές επιθέσεις
  6. Έλεγχος καταγραφής συμβάντων ασφαλείας
  7. Ασφαλής χειρισμός κωδικού πρόσβασης
  8. CSRF συμβολική προστασία

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'];

Γιατί δεν επιλέχθηκε αρχικά: Πολύ περίπλοκο για κοινόχρηστο περιβάλλον φιλοξενίας, αλλά καλό για μελλοντική ενσωμάτωση με εξωτερικά συστήματα εξουσιοδότησης.

# Έλεγχος ταυτότητας δύο παραγόντων (2FA)

Ενότητα με τίτλο «# Έλεγχος ταυτότητας δύο παραγόντων (2FA)»

Κατάσταση: Αποδεκτή ως επέκταση, όχι βασική απαίτηση, ανατρέξτε στο ADR-006

Κατάσταση: Υλοποιήθηκε - αποτρέπει την πρόσβαση JavaScript στα δεδομένα περιόδου λειτουργίας


  • ADR-001: Modular Architecture - Οι ενότητες υλοποιούν ασφάλεια
  • ADR-005: Σύστημα αδειών μονάδας
  • ADR-006: Έλεγχος ταυτότητας δύο παραγόντων (μέλλον)

  • OWASP ZAP - Δοκιμή ασφαλείας
  • Snyk - Σάρωση ευπάθειας
  • SonarQube - Ποιότητα κωδικού

  • Σύστημα ελέγχου ταυτότητας χρήστη
  • Διαχείριση συνεδρίας
  • Κατακερματισμός κωδικού πρόσβασης (bcrypt)
  • Έλεγχος πρόσβασης βάσει ρόλων
  • Δικαιώματα μονάδας
  • Πλαίσιο επικύρωσης εισόδου
  • Διαφυγή εξόδου (PHP + Smarty)
  • CSRF διακριτική προστασία
  • Καταγραφή ελέγχου ασφαλείας
  • Περιορισμός ποσοστού
  • Κεφαλίδες ασφαλείας

ΈκδοσηΗμερομηνίαΑλλαγές
1.0.028-01-2024Αρχικό έγγραφο

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

Ενότητα με τίτλο «XOOPS #adr #security #architecture #authentication #authorization #rbac»