Các phương pháp bảo mật tốt nhất
2.5.x ✅ 4.0.x ✅
Tài liệu này cung cấp các phương pháp thực hành tốt nhất về bảo mật toàn diện cho các nhà phát triển mô-đun XOOPS. Việc làm theo các nguyên tắc này sẽ giúp đảm bảo rằng modules của bạn được an toàn và không gây ra các lỗ hổng trong quá trình cài đặt XOOPS.
Nguyên tắc bảo mật
Phần tiêu đề “Nguyên tắc bảo mật”Mọi nhà phát triển XOOPS phải tuân theo các nguyên tắc bảo mật cơ bản sau:
- Phòng thủ chuyên sâu: Triển khai nhiều lớp kiểm soát bảo mật
- Đặc quyền tối thiểu: Chỉ cung cấp các quyền truy cập cần thiết tối thiểu
- Xác thực đầu vào: Không bao giờ tin tưởng đầu vào của người dùng
- Bảo mật theo mặc định: Bảo mật phải là cấu hình mặc định
- Giữ nó đơn giản: Các hệ thống phức tạp khó bảo mật hơn
Tài liệu liên quan
Phần tiêu đề “Tài liệu liên quan”- CSRF-Protection - Hệ thống Token và XoopsSecurity class
- Vệ sinh đầu vào - MyTextSanitizer và xác thực
- SQL-Injection-Prevention - Thực hành bảo mật cơ sở dữ liệu
Danh sách kiểm tra tham khảo nhanh
Phần tiêu đề “Danh sách kiểm tra tham khảo nhanh”Trước khi phát hành mô-đun của bạn, hãy xác minh:
- Tất cả các dạng token include XOOPS
- [] Tất cả thông tin đầu vào của người dùng đều được xác thực và vệ sinh
- [] Tất cả đầu ra đều được thoát đúng cách
- [] Tất cả các truy vấn cơ sở dữ liệu đều sử dụng các câu lệnh được tham số hóa
- Tệp uploads được xác thực hợp lệ
- Việc kiểm tra xác thực và ủy quyền được thực hiện
- [] Xử lý lỗi không tiết lộ thông tin nhạy cảm
- [] Cấu hình nhạy cảm được bảo vệ
- [] Thư viện của bên thứ ba được cập nhật
- Kiểm tra bảo mật đã được thực hiện
Xác thực và ủy quyền
Phần tiêu đề “Xác thực và ủy quyền”Kiểm tra xác thực người dùng
Phần tiêu đề “Kiểm tra xác thực người dùng”// Check if user is logged inif (!is_object($GLOBALS['xoopsUser'])) { redirect_header(XOOPS_URL, 3, _NOPERM); exit();}Kiểm tra quyền của người dùng
Phần tiêu đề “Kiểm tra quyền của người dùng”// 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();}Thiết lập quyền của mô-đun
Phần tiêu đề “Thiết lập quyền của mô-đun”// 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'));}Bảo mật phiên
Phần tiêu đề “Bảo mật phiên”Các phương pháp hay nhất về xử lý phiên
Phần tiêu đề “Các phương pháp hay nhất về xử lý phiên”- Không lưu trữ thông tin nhạy cảm trong phiên
- Tạo lại ID phiên sau khi thay đổi đăng nhập/đặc quyền
- Xác thực dữ liệu phiên trước khi sử dụng
// 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}Ngăn chặn việc cố định phiên
Phần tiêu đề “Ngăn chặn việc cố định phiên”// 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();}Bảo mật tải lên tệp
Phần tiêu đề “Bảo mật tải lên tệp”Xác thực tải lên tệp
Phần tiêu đề “Xác thực tải lên tệp”// 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();}Sử dụng Trình tải lên XOOPS
Phần tiêu đề “Sử dụng Trình tải lên 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(); // Save filename to database } else { echo $uploader->getErrors(); }} else { echo $uploader->getErrors();}Lưu trữ tệp đã tải lên một cách an toàn
Phần tiêu đề “Lưu trữ tệp đã tải lên một cách an toàn”// 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);Xử lý lỗi và ghi nhật ký
Phần tiêu đề “Xử lý lỗi và ghi nhật ký”Xử lý lỗi an toàn
Phần tiêu đề “Xử lý lỗi an toàn”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();}Ghi nhật ký sự kiện bảo mật
Phần tiêu đề “Ghi nhật ký sự kiện bảo mật”// Log security eventsxoops_loadLanguage('logger', 'mymodule');$GLOBALS['xoopsLogger']->addExtra('Security', 'Failed login attempt for user: ' . $username);Bảo mật cấu hình
Phần tiêu đề “Bảo mật cấu hình”Lưu trữ cấu hình nhạy cảm
Phần tiêu đề “Lưu trữ cấu hình nhạy cảm”// 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}Bảo vệ tập tin cấu hình
Phần tiêu đề “Bảo vệ tập tin cấu hình”Sử dụng .htaccess để bảo vệ các file cấu hình:
# In .htaccess<Files "config.php"> Order Allow,Deny Deny from all</Files>Thư viện của bên thứ ba
Phần tiêu đề “Thư viện của bên thứ ba”Chọn thư viện
Phần tiêu đề “Chọn thư viện”- Chọn thư viện được bảo trì tích cực
- Kiểm tra lỗ hổng bảo mật
- Xác minh giấy phép của thư viện có tương thích với XOOPS
Cập nhật thư viện
Phần tiêu đề “Cập nhật thư viện”// Check library versionif (version_compare(LIBRARY_VERSION, '1.2.3', '<')) { xoops_error('Please update the library to version 1.2.3 or higher');}Thư viện cô lập
Phần tiêu đề “Thư viện cô lập”// 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;}Kiểm tra bảo mật
Phần tiêu đề “Kiểm tra bảo mật”Danh sách kiểm tra thủ công1. Kiểm tra tất cả các biểu mẫu có dữ liệu nhập không hợp lệ
Phần tiêu đề “Danh sách kiểm tra thủ công1. Kiểm tra tất cả các biểu mẫu có dữ liệu nhập không hợp lệ”- Cố gắng bỏ qua xác thực và ủy quyền
- Kiểm tra chức năng upload file với file độc hại
- Kiểm tra lỗ hổng XSS ở tất cả đầu ra
- Kiểm tra việc chèn SQL trong tất cả các truy vấn cơ sở dữ liệu
Kiểm tra tự động
Phần tiêu đề “Kiểm tra tự động”Sử dụng các công cụ tự động để quét các lỗ hổng:
- Công cụ phân tích mã tĩnh
- Máy quét ứng dụng web
- Trình kiểm tra phụ thuộc cho thư viện của bên thứ ba
Thoát đầu ra
Phần tiêu đề “Thoát đầu ra”Bối cảnh HTML
Phần tiêu đề “Bối cảnh HTML”// For regular HTML contentecho htmlspecialchars($variable, ENT_QUOTES, 'UTF-8');
// Using MyTextSanitizer$myts = MyTextSanitizer::getInstance();echo $myts->htmlSpecialChars($variable);Bối cảnh JavaScript
Phần tiêu đề “Bối cảnh JavaScript”// For data used in JavaScriptecho json_encode($variable);
// For inline JavaScriptecho 'var data = ' . json_encode($variable) . ';';Bối cảnh URL
Phần tiêu đề “Bối cảnh URL”// For data used in URLsecho htmlspecialchars(urlencode($variable), ENT_QUOTES, 'UTF-8');Biến mẫu
Phần tiêu đề “Biến mẫu”// 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));Tài nguyên
Phần tiêu đề “Tài nguyên”#bảo mật #các phương pháp thực hành tốt nhất #xoops #phát triển mô-đun #xác thực #ủy quyền