تخطَّ إلى المحتوى

أفضل ممارسات الأمان

2.5.x ✅ 4.0.x ✅

يوفر هذا المستند أفضل ممارسات الأمان الشاملة لمطوري وحدات XOOPS. سيساعد اتباع هذه الإرشادات على ضمان أن الوحدات الخاصة بك آمنة ولا تقدم ثغرات في تثبيتات XOOPS.

يجب على كل مطور XOOPS اتباع هذه المبادئ الأساسية للأمان:

  1. الدفاع على عمق: تنفيذ طبقات متعددة من الضوابط الأمنية
  2. أقل امتياز: توفير الحد الأدنى فقط من حقوق الوصول الضرورية
  3. التحقق من المدخلات: لا تثق أبداً بمدخلات المستخدم
  4. آمن بالافتراضي: يجب أن يكون الأمان هو التكوين الافتراضي
  5. اجعلها بسيطة: الأنظمة المعقدة يصعب تأمينها
  • حماية CSRF - نظام الرمز وفئة XoopsSecurity
  • تطهير المدخلات - MyTextSanitizer والتحقق
  • منع حقن SQL - ممارسات أمان قاعدة البيانات

قائمة مرجعية الإشارة السريعة

Section titled “قائمة مرجعية الإشارة السريعة”

قبل إطلاق الوحدة الخاصة بك، تحقق من:

  • جميع النماذج تتضمن رموز XOOPS
  • يتم التحقق من جميع مدخلات المستخدم وتطهيرها
  • جميع الإخراج مفلوت بشكل صحيح
  • جميع استعلامات قاعدة البيانات تستخدم بيانات معدة مسبقاً
  • يتم التحقق من تحميل الملفات بشكل صحيح
  • فحوصات المصادقة والتفويض في مكانها
  • معالجة الأخطاء لا تكشف معلومات حساسة
  • التكوين الحساس محمي
  • مكتبات الطرف الثالث محدثة
  • تم إجراء اختبار الأمان

التحقق من المصادقة من المستخدم

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();
}
// إنشاء إذن في دالة التثبيت / التحديث
$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 “أفضل ممارسات معالجة الجلسة”
  1. لا تخزن معلومات حساسة في الجلسة
  2. أعد إنشاء معرفات الجلسات بعد تسجيل الدخول / تغييرات الامتياز
  3. تحقق من بيانات الجلسة قبل استخدامها
// أعد إنشاء معرّف الجلسة بعد تسجيل الدخول
session_regenerate_id(true);
// التحقق من بيانات الجلسة
if (isset($_SESSION['mymodule_user_id'])) {
$user_id = (int)$_SESSION['mymodule_user_id'];
// التحقق من وجود المستخدم في قاعدة البيانات
}
// بعد تسجيل الدخول بنجاح
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 “التحقق من تحميل الملفات”
// التحقق من تحميل الملف بشكل صحيح
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();
}
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 “معالجة الأخطاء والسجلات”
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();
}
// تسجيل أحداث الأمان
xoops_loadLanguage('logger', 'mymodule');
$GLOBALS['xoopsLogger']->addExtra('Security', 'Failed login attempt for user: ' . $username);
// حدد مسار التكوين خارج جذر الويب
$config_path = XOOPS_VAR_PATH . '/configs/mymodule/config.php';
// تحميل التكوين
if (file_exists($config_path)) {
include $config_path;
} else {
// التعامل مع التكوين المفقود
}

استخدم .htaccess لحماية ملفات التكوين:

# في .htaccess
<Files "config.php">
Order Allow,Deny
Deny from all
</Files>
  1. اختر المكتبات المحافظة عليها بنشاط
  2. تحقق من وجود ثغرات أمنية
  3. تحقق من أن ترخيص المكتبة متوافقة مع XOOPS
// فحص إصدار المكتبة
if (version_compare(LIBRARY_VERSION, '1.2.3', '<')) {
xoops_error('Please update the library to version 1.2.3 or higher');
}
// تحميل المكتبة بطريقة خاضعة للرقابة
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 “قائمة التحقق من الاختبار اليدوي”
  1. اختبر جميع النماذج بمدخلات غير صالحة
  2. حاول تجاوز المصادقة والتفويض
  3. اختبر وظائف تحميل الملفات بملفات ضارة
  4. تحقق من وجود ثغرات XSS في جميع الإخراج
  5. اختبر حقن SQL في جميع استعلامات قاعدة البيانات

استخدم الأدوات الآلية للبحث عن الثغرات:

  1. أدوات تحليل الكود الثابت
  2. ماسحات تطبيقات الويب
  3. فاحصو الاعتماديات لمكتبات الطرف الثالث
// للمحتوى العادي HTML
echo htmlspecialchars($variable, ENT_QUOTES, 'UTF-8');
// استخدام MyTextSanitizer
$myts = MyTextSanitizer::getInstance();
echo $myts->htmlSpecialChars($variable);
// لـ البيانات المستخدمة في JavaScript
echo json_encode($variable);
// لـ JavaScript مضمن
echo 'var data = ' . json_encode($variable) . ';';
// لـ البيانات المستخدمة في URLs
echo htmlspecialchars(urlencode($variable), ENT_QUOTES, 'UTF-8');
// تخصيص المتغيرات لنموذج 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 #تطوير-الوحدة #المصادقة #التفويض