بهترین شیوه های امنیتی
2.5.x ✅ 4.0.x ✅
:::tip [API های امنیتی در تمام نسخه ها پایدار هستند]
اقدامات امنیتی و APIهای مستند شده در اینجا در XOOPS 2.5.x و XOOPS 4.0.x کار می کنند. کلاس های امنیتی اصلی (XoopsSecurity، MyTextSanitizer) پایدار می مانند.
:::
این سند بهترین شیوه های امنیتی جامع را برای توسعه دهندگان ماژول XOOPS ارائه می دهد. پیروی از این دستورالعملها به شما کمک میکند تا مطمئن شوید که ماژولهای شما ایمن هستند و آسیبپذیریهایی را در نصبهای XOOPS وارد نمیکنند.
اصول امنیتی
Section titled “اصول امنیتی”هر توسعه دهنده XOOPS باید این اصول اساسی امنیتی را دنبال کند:
- دفاع در عمق: چندین لایه از کنترل های امنیتی را پیاده سازی کنید
- حداقل امتیاز: فقط حداقل حقوق دسترسی لازم را ارائه دهید
- Input Validation: هرگز به ورودی کاربر اعتماد نکنید
- Secure by Default: امنیت باید پیکربندی پیش فرض باشد
- ساده نگه دارید: امنیت سیستم های پیچیده سخت تر است
مستندات مرتبط
Section titled “مستندات مرتبط”- CSRF-Protection - سیستم توکن و کلاس XoopsSecurity
- Input-Sanitization - MyTextSanitizer و اعتبارسنجی
- SQL-Injection-Prevention - شیوه های امنیتی پایگاه داده
چک لیست مرجع سریع
Section titled “چک لیست مرجع سریع”قبل از انتشار ماژول خود، بررسی کنید:
- همه فرم ها شامل توکن های XOOPS هستند
- تمام ورودی های کاربر تایید و پاکسازی می شوند
- تمام خروجی به درستی خارج شده است
- همه پرس و جوهای پایگاه داده از عبارات پارامتری استفاده می کنند
- آپلودهای فایل به درستی تایید شده است
- بررسی های احراز هویت و مجوز وجود دارد
- رسیدگی به خطا اطلاعات حساس را نشان نمی دهد
- پیکربندی حساس محافظت می شود
- کتابخانه های شخص ثالث به روز هستند
- تست امنیتی انجام شده است
احراز هویت و مجوز
Section titled “احراز هویت و مجوز”بررسی احراز هویت کاربر
Section titled “بررسی احراز هویت کاربر”// Check if user is logged inif (!is_object($GLOBALS['xoopsUser'])) { redirect_header(XOOPS_URL, 3, _NOPERM); exit();}بررسی مجوزهای کاربر
Section titled “بررسی مجوزهای کاربر”// 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();}تنظیم مجوزهای ماژول
Section titled “تنظیم مجوزهای ماژول”// 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'));}امنیت جلسه
Section titled “امنیت جلسه”بهترین شیوه های مدیریت جلسه
Section titled “بهترین شیوه های مدیریت جلسه”- اطلاعات حساس را در جلسه ذخیره نکنید
- پس از تغییرات 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}جلوگیری از تثبیت جلسه
Section titled “جلوگیری از تثبیت جلسه”// 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();}امنیت آپلود فایل
Section titled “امنیت آپلود فایل”تایید بارگذاری فایل
Section titled “تایید بارگذاری فایل”// 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
Section titled “با استفاده از 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();}ذخیره سازی ایمن فایل های آپلود شده
Section titled “ذخیره سازی ایمن فایل های آپلود شده”// 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);مدیریت خطا و ثبت نام
Section titled “مدیریت خطا و ثبت نام”مدیریت ایمن خطا
Section titled “مدیریت ایمن خطا”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();}ثبت رویدادهای امنیتی
Section titled “ثبت رویدادهای امنیتی”// Log security eventsxoops_loadLanguage('logger', 'mymodule');$GLOBALS['xoopsLogger']->addExtra('Security', 'Failed login attempt for user: ' . $username);امنیت پیکربندی
Section titled “امنیت پیکربندی”ذخیره سازی پیکربندی حساس
Section titled “ذخیره سازی پیکربندی حساس”// 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}محافظت از فایل های پیکربندی
Section titled “محافظت از فایل های پیکربندی”از .htaccess برای محافظت از فایل های پیکربندی استفاده کنید:
# In .htaccess<Files "config.php"> Order Allow,Deny Deny from all</Files>کتابخانه های شخص ثالث
Section titled “کتابخانه های شخص ثالث”انتخاب کتابخانه ها
Section titled “انتخاب کتابخانه ها”- کتابخانه هایی را انتخاب کنید که به طور فعال نگهداری می شوند
- آسیب پذیری های امنیتی را بررسی کنید
- بررسی کنید که مجوز کتابخانه با XOOPS سازگار است
به روز رسانی کتابخانه ها
Section titled “به روز رسانی کتابخانه ها”// Check library versionif (version_compare(LIBRARY_VERSION, '1.2.3', '<')) { xoops_error('Please update the library to version 1.2.3 or higher');}جداسازی کتابخانه ها
Section titled “جداسازی کتابخانه ها”// 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;}تست امنیتی
Section titled “تست امنیتی”چک لیست تست دستی
Section titled “چک لیست تست دستی”- همه فرمهای دارای ورودی نامعتبر را تست کنید
- تلاش برای دور زدن احراز هویت و مجوز
- قابلیت آپلود فایل را با فایل های مخرب تست کنید
- آسیب پذیری های XSS را در همه خروجی ها بررسی کنید
- برای تزریق SQL در تمام کوئری های پایگاه داده تست کنید
تست خودکار
Section titled “تست خودکار”از ابزارهای خودکار برای اسکن آسیب پذیری ها استفاده کنید:
- ابزار تجزیه و تحلیل کد استاتیک
- اسکنرهای برنامه کاربردی وب
- بررسی وابستگی برای کتابخانه های شخص ثالث
خروجی فرار
Section titled “خروجی فرار”زمینه HTML
Section titled “زمینه HTML”// For regular HTML contentecho htmlspecialchars($variable, ENT_QUOTES, 'UTF-8');
// Using MyTextSanitizer$myts = MyTextSanitizer::getInstance();echo $myts->htmlSpecialChars($variable);زمینه جاوا اسکریپت
Section titled “زمینه جاوا اسکریپت”// For data used in JavaScriptecho json_encode($variable);
// For inline JavaScriptecho 'var data = ' . json_encode($variable) . ';';زمینه URL
Section titled “زمینه URL”// For data used in URLsecho htmlspecialchars(urlencode($variable), ENT_QUOTES, 'UTF-8');متغیرهای قالب
Section titled “متغیرهای قالب”// 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));---#امنیت #بهترین روشها #xoops #توسعه ماژول #احراز هویت #مجوز