Bevált biztonsági gyakorlatok
2.5.x ✅ 4.0.x ✅
A biztonsági API-k változatlanok stabilak
Az itt dokumentált biztonsági gyakorlatok és API-k a XOOPS 2.5.x és a XOOPS 4.0.x verzióban is működnek. Az alapvető biztonsági osztályok (XOOPSSecurity, MyTextSanitizer) stabilak maradnak.
Ez a dokumentum átfogó biztonsági bevált gyakorlatokat tartalmaz a XOOPS modulfejlesztők számára. Ezen irányelvek betartásával biztosíthatja, hogy a modulok biztonságosak legyenek, és ne okozzanak sebezhetőséget a XOOPS telepítésekben.
Biztonsági alapelvek
Szekció neve “Biztonsági alapelvek”Minden XOOPS fejlesztőnek követnie kell az alábbi alapvető biztonsági elveket:
- Mélységben történő védelem: A biztonsági ellenőrzések több rétegű alkalmazása
- Least Privilege: Csak a minimálisan szükséges hozzáférési jogokat adja meg
- Input Validation: Soha ne bízzon a felhasználói bevitelben
- Alapértelmezés szerint biztonságos: A biztonság legyen az alapértelmezett konfiguráció
- Keep It Simple: Az összetett rendszereket nehezebb biztosítani
Kapcsolódó dokumentáció
Szekció neve “Kapcsolódó dokumentáció”- CSRF-védelem - Token rendszer és XOOPS biztonsági osztály
- Input-Sanitization - MyTextSanitizer és érvényesítés
- SQL - Befecskendezés - Megelőzés - Adatbázis biztonsági gyakorlatok
Gyorsreferencia ellenőrzőlista
Szekció neve “Gyorsreferencia ellenőrzőlista”A modul kiadása előtt ellenőrizze:
- Minden űrlap tartalmaz XOOPS tokeneket
- Minden felhasználói bevitel érvényesítve és megtisztítva
- Minden kimenet megfelelően kikerült
- Minden adatbázis-lekérdezés paraméterezett utasításokat használ
- A fájlfeltöltések megfelelően érvényesek
- A hitelesítési és engedélyezési ellenőrzések működnek
- A hibakezelés nem tár fel bizalmas információkat
- Az érzékeny konfiguráció védett
- A harmadik féltől származó könyvtárak naprakészek
- A biztonsági tesztelés megtörtént
Hitelesítés és engedélyezés
Szekció neve “Hitelesítés és engedélyezés”Felhasználói hitelesítés ellenőrzése
Szekció neve “Felhasználói hitelesítés ellenőrzése”// Check if user is logged inif (!is_object($GLOBALS['xoopsUser'])) { redirect_header(XOOPS_URL, 3, _NOPERM); exit();}Felhasználói engedélyek ellenőrzése
Szekció neve “Felhasználói engedélyek ellenőrzése”// 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();}modulengedélyek beállítása
Szekció neve “modulengedélyek beállítása”// 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'));}Session Security
Szekció neve “Session Security”Munkamenet-kezelési bevált gyakorlatok
Szekció neve “Munkamenet-kezelési bevált gyakorlatok”- Ne tároljon érzékeny információkat a munkamenetben
- A login/privilege módosítások után generálja újra a munkamenet-azonosítókat
- Használat előtt ellenőrizze a munkamenet adatait
// 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}Munkamenetrögzítés megelőzése
Szekció neve “Munkamenetrögzítés megelőzése”// 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();}Fájlfeltöltés biztonsága
Szekció neve “Fájlfeltöltés biztonsága”Fájlfeltöltések érvényesítése
Szekció neve “Fájlfeltöltések érvényesítése”// 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();}A XOOPS Uploader használata
Szekció neve “A XOOPS Uploader használata”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();}A feltöltött fájlok biztonságos tárolása
Szekció neve “A feltöltött fájlok biztonságos tárolása”// 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);Hibakezelés és naplózás
Szekció neve “Hibakezelés és naplózás”Biztonságos hibakezelés
Szekció neve “Biztonságos hibakezelés”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();}Biztonsági események naplózása
Szekció neve “Biztonsági események naplózása”// Log security eventsxoops_loadLanguage('logger', 'mymodule');$GLOBALS['xoopsLogger']->addExtra('Security', 'Failed login attempt for user: ' . $username);Konfigurációs biztonság
Szekció neve “Konfigurációs biztonság”Érzékeny konfiguráció tárolása
Szekció neve “Érzékeny konfiguráció tárolása”// 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}Konfigurációs fájlok védelme
Szekció neve “Konfigurációs fájlok védelme”Használja a .htaccess-t a konfigurációs fájlok védelmére:
# In .htaccess<Files "config.php"> Order Allow,Deny Deny from all</Files>Harmadik féltől származó könyvtárak
Szekció neve “Harmadik féltől származó könyvtárak”Könyvtárak kiválasztása
Szekció neve “Könyvtárak kiválasztása”- Válasszon aktívan karbantartott könyvtárakat
- Ellenőrizze a biztonsági réseket
- Ellenőrizze, hogy a könyvtár licence kompatibilis-e a XOOPS-val
Könyvtárak frissítése
Szekció neve “Könyvtárak frissítése”// Check library versionif (version_compare(LIBRARY_VERSION, '1.2.3', '<')) { xoops_error('Please update the library to version 1.2.3 or higher');}Könyvtárak elkülönítése
Szekció neve “Könyvtárak elkülönítése”// 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;}Biztonsági tesztelés
Szekció neve “Biztonsági tesztelés”Kézi tesztelés ellenőrzőlista
Szekció neve “Kézi tesztelés ellenőrzőlista”- Teszteljen minden érvénytelen adatot tartalmazó űrlapot
- Kísérlet a hitelesítés és az engedélyezés megkerülésére
- Tesztelje a fájlfeltöltési funkciót rosszindulatú fájlokkal
- Ellenőrizze a XSS sebezhetőséget az összes kimeneten
- Tesztelje a SQL injekciót az összes adatbázis-lekérdezésben
Automatizált tesztelés
Szekció neve “Automatizált tesztelés”Használjon automatizált eszközöket a sebezhetőségek kereséséhez:
- Statikus kódelemző eszközök
- Webalkalmazás-szkennerek
- Függőség-ellenőrzők harmadik féltől származó könyvtárak számára
Output Escape
Szekció neve “Output Escape”HTML Kontextus
Szekció neve “HTML Kontextus”// For regular HTML contentecho htmlspecialchars($variable, ENT_QUOTES, 'UTF-8');
// Using MyTextSanitizer$myts = MyTextSanitizer::getInstance();echo $myts->htmlSpecialChars($variable);JavaScript kontextus
Szekció neve “JavaScript kontextus”// For data used in JavaScriptecho json_encode($variable);
// For inline JavaScriptecho 'var data = ' . json_encode($variable) . ';';URL Kontextus
Szekció neve “URL Kontextus”// For data used in URLsecho htmlspecialchars(urlencode($variable), ENT_QUOTES, 'UTF-8');Sablonváltozók
Szekció neve “Sablonváltozók”// 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));Források
Szekció neve “Források”#biztonság #legjobb gyakorlatok #xoops #modulfejlesztés #hitelesítés #engedélyezés