أفضل ممارسات الأمان
2.5.x ✅ 4.0.x ✅
يوفر هذا المستند أفضل ممارسات الأمان الشاملة لمطوري وحدات XOOPS. سيساعد اتباع هذه الإرشادات على ضمان أن الوحدات الخاصة بك آمنة ولا تقدم ثغرات في تثبيتات XOOPS.
مبادئ الأمان
Section titled “مبادئ الأمان”يجب على كل مطور XOOPS اتباع هذه المبادئ الأساسية للأمان:
- الدفاع على عمق: تنفيذ طبقات متعددة من الضوابط الأمنية
- أقل امتياز: توفير الحد الأدنى فقط من حقوق الوصول الضرورية
- التحقق من المدخلات: لا تثق أبداً بمدخلات المستخدم
- آمن بالافتراضي: يجب أن يكون الأمان هو التكوين الافتراضي
- اجعلها بسيطة: الأنظمة المعقدة يصعب تأمينها
الوثائق ذات الصلة
Section titled “الوثائق ذات الصلة”- حماية CSRF - نظام الرمز وفئة XoopsSecurity
- تطهير المدخلات - MyTextSanitizer والتحقق
- منع حقن SQL - ممارسات أمان قاعدة البيانات
قائمة مرجعية الإشارة السريعة
Section titled “قائمة مرجعية الإشارة السريعة”قبل إطلاق الوحدة الخاصة بك، تحقق من:
- جميع النماذج تتضمن رموز XOOPS
- يتم التحقق من جميع مدخلات المستخدم وتطهيرها
- جميع الإخراج مفلوت بشكل صحيح
- جميع استعلامات قاعدة البيانات تستخدم بيانات معدة مسبقاً
- يتم التحقق من تحميل الملفات بشكل صحيح
- فحوصات المصادقة والتفويض في مكانها
- معالجة الأخطاء لا تكشف معلومات حساسة
- التكوين الحساس محمي
- مكتبات الطرف الثالث محدثة
- تم إجراء اختبار الأمان
المصادقة والتفويض
Section titled “المصادقة والتفويض”التحقق من المصادقة من المستخدم
Section titled “التحقق من المصادقة من المستخدم”// تحقق مما إذا كان المستخدم مسجل دخولif (!is_object($GLOBALS['xoopsUser'])) { redirect_header(XOOPS_URL, 3, _NOPERM); exit();}التحقق من أذونات المستخدم
Section titled “التحقق من أذونات المستخدم”// تحقق مما إذا كان المستخدم لديه إذن للوصول إلى هذه الوحدةif (!$GLOBALS['xoopsUser']->isAdmin($xoopsModule->mid())) { redirect_header(XOOPS_URL, 3, _NOPERM); exit();}
// تحقق من إذن محدد$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 “إعداد أذونات الوحدة”// إنشاء إذن في دالة التثبيت / التحديث$gpermHandler = xoops_getHandler('groupperm');$gpermHandler->deleteByModule($module->getVar('mid'), 'mymodule_view');
// إضافة إذن لجميع المجموعات$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 “أفضل ممارسات معالجة الجلسة”- لا تخزن معلومات حساسة في الجلسة
- أعد إنشاء معرفات الجلسات بعد تسجيل الدخول / تغييرات الامتياز
- تحقق من بيانات الجلسة قبل استخدامها
// أعد إنشاء معرّف الجلسة بعد تسجيل الدخولsession_regenerate_id(true);
// التحقق من بيانات الجلسةif (isset($_SESSION['mymodule_user_id'])) { $user_id = (int)$_SESSION['mymodule_user_id']; // التحقق من وجود المستخدم في قاعدة البيانات}منع إصلاح الجلسة
Section titled “منع إصلاح الجلسة”// بعد تسجيل الدخول بنجاحsession_regenerate_id(true);$_SESSION['mymodule_user_ip'] = $_SERVER['REMOTE_ADDR'];
// في الطلبات اللاحقةif ($_SESSION['mymodule_user_ip'] !== $_SERVER['REMOTE_ADDR']) { // محاولة اختطاف جلسة محتملة session_destroy(); redirect_header('index.php', 3, 'Session error'); exit();}أمان تحميل الملف
Section titled “أمان تحميل الملف”التحقق من تحميل الملفات
Section titled “التحقق من تحميل الملفات”// التحقق من تحميل الملف بشكل صحيحif (!isset($_FILES['userfile']) || $_FILES['userfile']['error'] != UPLOAD_ERR_OK) { redirect_header('index.php', 3, 'File upload error'); exit();}
// تحقق من حجم الملفif ($_FILES['userfile']['size'] > 1000000) { // حد 1 ميجابايت redirect_header('index.php', 3, 'File too large'); exit();}
// تحقق من نوع الملف$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();}
// التحقق من امتداد الملف$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
Section titled “استخدام محمل XOOPS”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(); // احفظ اسم الملف في قاعدة البيانات } else { echo $uploader->getErrors(); }} else { echo $uploader->getErrors();}تخزين الملفات المرفوعة بأمان
Section titled “تخزين الملفات المرفوعة بأمان”// حدد دليل التحميل خارج جذر الويب$upload_dir = XOOPS_VAR_PATH . '/uploads/mymodule';
// أنشئ دليل إذا لم يكن موجوداًif (!is_dir($upload_dir)) { mkdir($upload_dir, 0755, true);}
// نقل الملف المرفوعmove_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) { // تسجيل الخطأ xoops_error($e->getMessage());
// عرض رسالة خطأ عامة للمستخدم redirect_header('index.php', 3, 'An error occurred. Please try again later.'); exit();}تسجيل أحداث الأمان
Section titled “تسجيل أحداث الأمان”// تسجيل أحداث الأمانxoops_loadLanguage('logger', 'mymodule');$GLOBALS['xoopsLogger']->addExtra('Security', 'Failed login attempt for user: ' . $username);أمان التكوين
Section titled “أمان التكوين”تخزين التكوين الحساس
Section titled “تخزين التكوين الحساس”// حدد مسار التكوين خارج جذر الويب$config_path = XOOPS_VAR_PATH . '/configs/mymodule/config.php';
// تحميل التكوينif (file_exists($config_path)) { include $config_path;} else { // التعامل مع التكوين المفقود}حماية ملفات التكوين
Section titled “حماية ملفات التكوين”استخدم .htaccess لحماية ملفات التكوين:
# في .htaccess<Files "config.php"> Order Allow,Deny Deny from all</Files>مكتبات الطرف الثالث
Section titled “مكتبات الطرف الثالث”اختيار المكتبات
Section titled “اختيار المكتبات”- اختر المكتبات المحافظة عليها بنشاط
- تحقق من وجود ثغرات أمنية
- تحقق من أن ترخيص المكتبة متوافقة مع XOOPS
تحديث المكتبات
Section titled “تحديث المكتبات”// فحص إصدار المكتبةif (version_compare(LIBRARY_VERSION, '1.2.3', '<')) { xoops_error('Please update the library to version 1.2.3 or higher');}عزل المكتبات
Section titled “عزل المكتبات”// تحميل المكتبة بطريقة خاضعة للرقابةfunction 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”// للمحتوى العادي HTMLecho htmlspecialchars($variable, ENT_QUOTES, 'UTF-8');
// استخدام MyTextSanitizer$myts = MyTextSanitizer::getInstance();echo $myts->htmlSpecialChars($variable);سياق JavaScript
Section titled “سياق JavaScript”// لـ البيانات المستخدمة في JavaScriptecho json_encode($variable);
// لـ JavaScript مضمنecho 'var data = ' . json_encode($variable) . ';';سياق URL
Section titled “سياق URL”// لـ البيانات المستخدمة في URLsecho htmlspecialchars(urlencode($variable), ENT_QUOTES, 'UTF-8');متغيرات النموذج
Section titled “متغيرات النموذج”// تخصيص المتغيرات لنموذج Smarty$GLOBALS['xoopsTpl']->assign('title', htmlspecialchars($title, ENT_QUOTES, 'UTF-8'));
// للمحتوى HTML الذي يجب عرضه كما هو$GLOBALS['xoopsTpl']->assign('content', $myts->displayTarea($content, 1, 1, 1, 1, 1));#أمان #أفضل-ممارسات #xoops #تطوير-الوحدة #المصادقة #التفويض