En İyi Güvenlik Uygulamaları
2.5.x ✅ 4.0.x ✅
Bu belge, XOOPS module geliştiricileri için kapsamlı güvenlik en iyi uygulamalarını sağlar. Bu yönergeleri takip etmek, modüllerinizin güvenli olduğundan emin olmanıza ve XOOPS kurulumlarında güvenlik açıklarına yol açmamasına yardımcı olacaktır.
Güvenlik İlkeleri
Section titled “Güvenlik İlkeleri”Her XOOPS geliştiricisinin şu temel güvenlik ilkelerine uyması gerekir:
- Derinlemesine Savunma: Birden fazla güvenlik kontrolü katmanı uygulayın
- En Az Ayrıcalık: Yalnızca gerekli minimum erişim haklarını sağlayın
- Giriş Doğrulaması: user girişine asla güvenmeyin
- Varsayılan Olarak Güvenli: Güvenlik varsayılan yapılandırma olmalıdır
- Basit Tutun: Karmaşık sistemlerin güvenliğinin sağlanması daha zordur
İlgili Belgeler
Section titled “İlgili Belgeler”- CSRF-Koruma - Token sistemi ve XoopsSecurity sınıfı
- Giriş Temizleme - MyTextSanitizer ve doğrulama
- SQL-Enjeksiyon-Önleme - database güvenliği uygulamaları
Hızlı Referans Kontrol Listesi
Section titled “Hızlı Referans Kontrol Listesi”Modülünüzü serbest bırakmadan önce şunları doğrulayın:
- Tüm formlar XOOPS jetonlarını içerir
- Tüm user girdileri doğrulandı ve temizlendi
- Tüm çıktıların düzgün şekilde atlanması
- Tüm database sorguları parametreli ifadeler kullanır
- Dosya yüklemeleri düzgün bir şekilde doğrulandı
- Kimlik doğrulama ve yetkilendirme kontrolleri mevcut
- Hata işleme hassas bilgileri ortaya çıkarmaz
- Hassas konfigürasyon korunmaktadır
- Üçüncü taraf kitaplıkları güncel
- Güvenlik testi gerçekleştirildi
Kimlik Doğrulama ve Yetkilendirme
Section titled “Kimlik Doğrulama ve Yetkilendirme”user Kimlik Doğrulamasını Kontrol Etme
Section titled “user Kimlik Doğrulamasını Kontrol Etme”// Check if user is logged inif (!is_object($GLOBALS['xoopsUser'])) { redirect_header(XOOPS_URL, 3, _NOPERM); exit();}user İzinlerini Kontrol Etme
Section titled “user İzinlerini Kontrol Etme”// 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();}module İzinlerini Ayarlama
Section titled “module İzinlerini Ayarlama”// 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'));}Oturum Güvenliği
Section titled “Oturum Güvenliği”Oturum Yönetimi En İyi Uygulamaları
Section titled “Oturum Yönetimi En İyi Uygulamaları”- Oturumda hassas bilgileri saklamayın
- login/privilege değişikliklerinden sonra oturum kimliklerini yeniden oluşturun
- Kullanmadan önce oturum verilerini doğrulayın
// 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}Oturum Sabitlemesini Önleme
Section titled “Oturum Sabitlemesini Önleme”// 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();}Dosya Yükleme Güvenliği
Section titled “Dosya Yükleme Güvenliği”Dosya Yüklemelerini Doğrulama
Section titled “Dosya Yüklemelerini Doğrulama”// 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 Yükleyiciyi Kullanma
Section titled “XOOPS Yükleyiciyi Kullanma”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();}Yüklenen Dosyaları Güvenli Bir Şekilde Saklama
Section titled “Yüklenen Dosyaları Güvenli Bir Şekilde Saklama”// 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);Hata İşleme ve Günlüğe Kaydetme
Section titled “Hata İşleme ve Günlüğe Kaydetme”Güvenli Hata İşleme
Section titled “Güvenli Hata İşleme”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();}Güvenlik Olaylarını Günlüğe Kaydetme
Section titled “Güvenlik Olaylarını Günlüğe Kaydetme”// Log security eventsxoops_loadLanguage('logger', 'mymodule');$GLOBALS['xoopsLogger']->addExtra('Security', 'Failed login attempt for user: ' . $username);Yapılandırma Güvenliği
Section titled “Yapılandırma Güvenliği”Hassas Yapılandırmanın Saklanması
Section titled “Hassas Yapılandırmanın Saklanması”// 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}Yapılandırma Dosyalarını Koruma
Section titled “Yapılandırma Dosyalarını Koruma”Yapılandırma dosyalarını korumak için .htaccess kullanın:
# In .htaccess<Files "config.php"> Order Allow,Deny Deny from all</Files>Third-Party Libraries
Section titled “Third-Party Libraries”Selecting Libraries
Section titled “Selecting Libraries”- Aktif olarak bakımı yapılan kitaplıkları seçin
- Güvenlik açıklarını kontrol edin
- Kütüphanenin lisansının XOOPS ile uyumlu olduğunu doğrulayın
Updating Libraries
Section titled “Updating Libraries”// Check library versionif (version_compare(LIBRARY_VERSION, '1.2.3', '<')) { xoops_error('Please update the library to version 1.2.3 or higher');}Kitaplıkları Yalıtmak
Section titled “Kitaplıkları Yalıtmak”// 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;}Güvenlik Testi
Section titled “Güvenlik Testi”Manuel Test Kontrol Listesi
Section titled “Manuel Test Kontrol Listesi”- Tüm formları geçersiz girişle test edin
- Kimlik doğrulama ve yetkilendirmeyi atlamaya çalışın
- Dosya yükleme işlevini kötü amaçlı dosyalarla test edin
- Tüm çıktılarda XSS güvenlik açıklarını kontrol edin
- Tüm database sorgularında SQL enjeksiyonunu test edin
Otomatik Test
Section titled “Otomatik Test”Güvenlik açıklarını taramak için otomatik araçları kullanın:
- Statik kod analiz araçları
- Web uygulaması tarayıcıları
- Üçüncü taraf kütüphaneler için bağımlılık denetleyicileri
Çıkış Çıkışı
Section titled “Çıkış Çıkışı”HTML Bağlam
Section titled “HTML Bağlam”// For regular HTML contentecho htmlspecialchars($variable, ENT_QUOTES, 'UTF-8');
// Using MyTextSanitizer$myts = MyTextSanitizer::getInstance();echo $myts->htmlSpecialChars($variable);JavaScript Bağlam
Section titled “JavaScript Bağlam”// For data used in JavaScriptecho json_encode($variable);
// For inline JavaScriptecho 'var data = ' . json_encode($variable) . ';';URL Bağlam
Section titled “URL Bağlam”// For data used in URLsecho htmlspecialchars(urlencode($variable), ENT_QUOTES, 'UTF-8');template Değişkenleri
Section titled “template Değişkenleri”// 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));Kaynaklar
Section titled “Kaynaklar”#güvenlik #en iyi uygulamalar #xoops #module geliştirme #kimlik doğrulama #yetkilendirme