Βέλτιστες πρακτικές ασφάλειας
2.5.x ✅ 4.0.x ✅
:::tip [Τα API ασφαλείας είναι σταθερά σε όλες τις εκδόσεις]
Οι πρακτικές ασφαλείας και τα API που τεκμηριώνονται εδώ λειτουργούν τόσο σε XOOPS 2.5.x και XOOPS 4.0.x. Οι βασικές κατηγορίες ασφαλείας (XoopsSecurity , MyTextSanitizer) παραμένουν σταθερές.
:::
Αυτό το έγγραφο παρέχει ολοκληρωμένες βέλτιστες πρακτικές ασφάλειας για προγραμματιστές μονάδων XOOPS. Η τήρηση αυτών των οδηγιών θα σας βοηθήσει να διασφαλίσετε ότι οι μονάδες σας είναι ασφαλείς και δεν εισάγουν τρωτά σημεία στις εγκαταστάσεις XOOPS.
Αρχές ασφάλειας
Ενότητα με τίτλο «Αρχές ασφάλειας»Κάθε προγραμματιστής XOOPS πρέπει να ακολουθεί αυτές τις θεμελιώδεις αρχές ασφάλειας:
- Defense in Depth: Εφαρμόστε πολλαπλά επίπεδα ελέγχων ασφαλείας
- Λάγιστο προνόμιο: Παρέχετε μόνο τα ελάχιστα απαραίτητα δικαιώματα πρόσβασης
- Επικύρωση εισόδου: Ποτέ μην εμπιστεύεστε τα στοιχεία του χρήστη
- Ασφάλεια από προεπιλογή: Η ασφάλεια πρέπει να είναι η προεπιλεγμένη διαμόρφωση
- Κρατήστε το απλό: Τα σύνθετα συστήματα είναι πιο δύσκολο να ασφαλιστούν
Σχετική τεκμηρίωση
Ενότητα με τίτλο «Σχετική τεκμηρίωση»- CSRF-Protection - Token system και XoopsSecurity class
- Input-Sanitization - MyTextSanitizer και επικύρωση
- SQL-Injection-Prevention - Πρακτικές ασφάλειας βάσης δεδομένων
Λίστα ελέγχου γρήγορης αναφοράς
Ενότητα με τίτλο «Λίστα ελέγχου γρήγορης αναφοράς»Πριν απελευθερώσετε τη μονάδα σας, επαληθεύστε:
- Όλες οι φόρμες περιλαμβάνουν μάρκες XOOPS
- Όλες οι εισαγωγές χρήστη επικυρώνονται και απολυμαίνονται
- Όλη η έξοδος έχει διαφύγει σωστά
- Όλα τα ερωτήματα της βάσης δεδομένων χρησιμοποιούν παραμετροποιημένες δηλώσεις
- Οι μεταφορτώσεις αρχείων έχουν επικυρωθεί σωστά
- Πραγματοποιούνται έλεγχοι ελέγχου ταυτότητας και εξουσιοδότησης
- Ο χειρισμός σφαλμάτων δεν αποκαλύπτει ευαίσθητες πληροφορίες
- Προστατεύεται η ευαίσθητη διαμόρφωση
- Οι βιβλιοθήκες τρίτων είναι ενημερωμένες
- Έγινε δοκιμή ασφαλείας
Έλεγχος ταυτότητας και εξουσιοδότηση
Ενότητα με τίτλο «Έλεγχος ταυτότητας και εξουσιοδότηση»# Έλεγχος ελέγχου ταυτότητας χρήστη
Ενότητα με τίτλο «# Έλεγχος ελέγχου ταυτότητας χρήστη»// Check if user is logged inif (!is_object($GLOBALS['xoopsUser'])) { redirect_header(XOOPS_URL, 3, _NOPERM); exit();}# Έλεγχος δικαιωμάτων χρήστη
Ενότητα με τίτλο «# Έλεγχος δικαιωμάτων χρήστη»// Check if user has permission to access this moduleif (!$GLOBALS['xoopsUser']->isAdmin($xoopsModule->mid())) { redirect_header(XOOPS_URL, 3, _NOPERM); exit();}
// Check specific permission$moduleHandler = xoops_getHandler('module');$module = $moduleHandler->getByDirname('mymodule');$moduleperm_handler = xoops_getHandler('groupperm');$groups = $GLOBALS['xoopsUser']->getGroups();
if (!$moduleperm_handler->checkRight('mymodule_view', $item_id, $groups, $module->getVar('mid'))) { redirect_header(XOOPS_URL, 3, _NOPERM); exit();}# Ρύθμιση δικαιωμάτων μονάδας
Ενότητα με τίτλο «# Ρύθμιση δικαιωμάτων μονάδας»// Create permission in install/update function$gpermHandler = xoops_getHandler('groupperm');$gpermHandler->deleteByModule($module->getVar('mid'), 'mymodule_view');
// Add permission for all groups$groups = [XOOPS_GROUP_ADMIN, XOOPS_GROUP_USERS, XOOPS_GROUP_ANONYMOUS];foreach ($groups as $group_id) { $gpermHandler->addRight('mymodule_view', 1, $group_id, $module->getVar('mid'));}Ασφάλεια συνεδρίας
Ενότητα με τίτλο «Ασφάλεια συνεδρίας»# Βέλτιστες πρακτικές χειρισμού συνεδρίας
Ενότητα με τίτλο «# Βέλτιστες πρακτικές χειρισμού συνεδρίας»- Μην αποθηκεύετε ευαίσθητες πληροφορίες στη συνεδρία
- Αναδημιουργήστε τα αναγνωριστικά περιόδου σύνδεσης μετά τις αλλαγές login/privilege
- Επικυρώστε τα δεδομένα συνεδρίας πριν τα χρησιμοποιήσετε
// Regenerate session ID after loginsession_regenerate_id(true);
// Validate session dataif (isset($_SESSION['mymodule_user_id'])) { $user_id = (int)$_SESSION['mymodule_user_id']; // Verify user exists in database}# Πρόληψη διόρθωσης συνεδρίας
Ενότητα με τίτλο «# Πρόληψη διόρθωσης συνεδρίας»// After successful loginsession_regenerate_id(true);$_SESSION['mymodule_user_ip'] = $_SERVER['REMOTE_ADDR'];
// On subsequent requestsif ($_SESSION['mymodule_user_ip'] !== $_SERVER['REMOTE_ADDR']) { // Possible session hijacking attempt session_destroy(); redirect_header('index.php', 3, 'Session error'); exit();}Ασφάλεια μεταφόρτωσης αρχείων
Ενότητα με τίτλο «Ασφάλεια μεταφόρτωσης αρχείων»# Επικύρωση μεταφορτώσεων αρχείων
Ενότητα με τίτλο «# Επικύρωση μεταφορτώσεων αρχείων»// Check if file was uploaded properlyif (!isset($_FILES['userfile']) || $_FILES['userfile']['error'] != UPLOAD_ERR_OK) { redirect_header('index.php', 3, 'File upload error'); exit();}
// Check file sizeif ($_FILES['userfile']['size'] > 1000000) { // 1MB limit redirect_header('index.php', 3, 'File too large'); exit();}
// Check file type$allowed_types = ['image/jpeg', 'image/png', 'image/gif'];if (!in_array($_FILES['userfile']['type'], $allowed_types)) { redirect_header('index.php', 3, 'Invalid file type'); exit();}
// Validate file extension$filename = $_FILES['userfile']['name'];$ext = strtolower(pathinfo($filename, PATHINFO_EXTENSION));$allowed_extensions = ['jpg', 'jpeg', 'png', 'gif'];if (!in_array($ext, $allowed_extensions)) { redirect_header('index.php', 3, 'Invalid file extension'); exit();}# Χρήση του XOOPS Uploader
Ενότητα με τίτλο «# Χρήση του XOOPS Uploader»include_once XOOPS_ROOT_PATH . '/class/uploader.php';
$allowed_mimetypes = ['image/gif', 'image/jpeg', 'image/png'];$maxsize = 1000000; // 1MB$maxwidth = 1024;$maxheight = 768;$upload_dir = XOOPS_ROOT_PATH . '/uploads/mymodule';
$uploader = new XoopsMediaUploader( $upload_dir, $allowed_mimetypes, $maxsize, $maxwidth, $maxheight);
if ($uploader->fetchMedia('userfile')) { $uploader->setPrefix('mymodule_');
if ($uploader->upload()) { $filename = $uploader->getSavedFileName(); // Save filename to database } else { echo $uploader->getErrors(); }} else { echo $uploader->getErrors();}# Ασφαλής αποθήκευση των μεταφορτωμένων αρχείων
Ενότητα με τίτλο «# Ασφαλής αποθήκευση των μεταφορτωμένων αρχείων»// Define upload directory outside web root$upload_dir = XOOPS_VAR_PATH . '/uploads/mymodule';
// Create directory if it doesn't existif (!is_dir($upload_dir)) { mkdir($upload_dir, 0755, true);}
// Move uploaded filemove_uploaded_file($_FILES['userfile']['tmp_name'], $upload_dir . '/' . $safe_filename);Χειρισμός και καταγραφή σφαλμάτων
Ενότητα με τίτλο «Χειρισμός και καταγραφή σφαλμάτων»# Ασφαλής χειρισμός σφαλμάτων
Ενότητα με τίτλο «# Ασφαλής χειρισμός σφαλμάτων»try { $result = someFunction(); if (!$result) { throw new Exception('Operation failed'); }} catch (Exception $e) { // Log the error xoops_error($e->getMessage());
// Display a generic error message to the user redirect_header('index.php', 3, 'An error occurred. Please try again later.'); exit();}# Καταγραφή συμβάντων ασφαλείας
Ενότητα με τίτλο «# Καταγραφή συμβάντων ασφαλείας»// Log security eventsxoops_loadLanguage('logger', 'mymodule');$GLOBALS['xoopsLogger']->addExtra('Security', 'Failed login attempt for user: ' . $username);Ασφάλεια διαμόρφωσης
Ενότητα με τίτλο «Ασφάλεια διαμόρφωσης»# Αποθήκευση ευαίσθητης διαμόρφωσης
Ενότητα με τίτλο «# Αποθήκευση ευαίσθητης διαμόρφωσης»// Define configuration path outside web root$config_path = XOOPS_VAR_PATH . '/configs/mymodule/config.php';
// Load configurationif (file_exists($config_path)) { include $config_path;} else { // Handle missing configuration}# Προστασία αρχείων διαμόρφωσης
Ενότητα με τίτλο «# Προστασία αρχείων διαμόρφωσης»Χρησιμοποιήστε το .htaccess για την προστασία των αρχείων διαμόρφωσης:
# In .htaccess<Files "config.php"> Order Allow,Deny Deny from all</Files>Βιβλιοθήκες τρίτων
Ενότητα με τίτλο «Βιβλιοθήκες τρίτων»# Επιλογή Βιβλιοθηκών
Ενότητα με τίτλο «# Επιλογή Βιβλιοθηκών»- Επιλέξτε ενεργά διατηρούμενες βιβλιοθήκες
- Ελέγξτε για τρωτά σημεία ασφαλείας
- Βεβαιωθείτε ότι η άδεια χρήσης της βιβλιοθήκης είναι συμβατή με το XOOPS
# Ενημέρωση βιβλιοθηκών
Ενότητα με τίτλο «# Ενημέρωση βιβλιοθηκών»// Check library versionif (version_compare(LIBRARY_VERSION, '1.2.3', '<')) { xoops_error('Please update the library to version 1.2.3 or higher');}# Απομόνωση Βιβλιοθηκών
Ενότητα με τίτλο «# Απομόνωση Βιβλιοθηκών»// Load library in a controlled wayfunction loadLibrary($file){ $allowed = ['parser.php', 'formatter.php'];
if (!in_array($file, $allowed)) { return false; }
include_once XOOPS_ROOT_PATH . '/modules/mymodule/libraries/' . $file; return true;}Δοκιμή ασφαλείας
Ενότητα με τίτλο «Δοκιμή ασφαλείας»# Λίστα ελέγχου χειροκίνητων δοκιμών
Ενότητα με τίτλο «# Λίστα ελέγχου χειροκίνητων δοκιμών»- Δοκιμάστε όλες τις φόρμες με μη έγκυρη εισαγωγή
- Προσπαθήστε να παρακάμψετε τον έλεγχο ταυτότητας και την εξουσιοδότηση
- Δοκιμάστε τη λειτουργία μεταφόρτωσης αρχείων με κακόβουλα αρχεία
- Ελέγξτε για ευπάθειες XSS σε όλες τις εξόδους
- Δοκιμάστε για ένεση SQL σε όλα τα ερωτήματα της βάσης δεδομένων
# Αυτοματοποιημένη δοκιμή
Ενότητα με τίτλο «# Αυτοματοποιημένη δοκιμή»Χρησιμοποιήστε αυτοματοποιημένα εργαλεία για σάρωση για τρωτά σημεία:
- Εργαλεία ανάλυσης στατικού κώδικα
- Σαρωτές διαδικτυακών εφαρμογών
- Έλεγχοι εξάρτησης για βιβλιοθήκες τρίτων
Διαφυγή εξόδου
Ενότητα με τίτλο «Διαφυγή εξόδου»# HTML Περιεχόμενο
Ενότητα με τίτλο «# HTML Περιεχόμενο»// For regular HTML contentecho htmlspecialchars($variable, ENT_QUOTES, 'UTF-8');
// Using MyTextSanitizer$myts = MyTextSanitizer::getInstance();echo $myts->htmlSpecialChars($variable);# Περιεχόμενο JavaScript
Ενότητα με τίτλο «# Περιεχόμενο JavaScript»// For data used in JavaScriptecho json_encode($variable);
// For inline JavaScriptecho 'var data = ' . json_encode($variable) . ';';# URL Περιεχόμενο
Ενότητα με τίτλο «# URL Περιεχόμενο»// For data used in URLsecho htmlspecialchars(urlencode($variable), ENT_QUOTES, 'UTF-8');# Μεταβλητές προτύπου
Ενότητα με τίτλο «# Μεταβλητές προτύπου»// Assign variables to Smarty template$GLOBALS['xoopsTpl']->assign('title', htmlspecialchars($title, ENT_QUOTES, 'UTF-8'));
// For HTML content that should be displayed as-is$GLOBALS['xoopsTpl']->assign('content', $myts->displayTarea($content, 1, 1, 1, 1, 1));