حفاظت CSRF
2.5.x ✅ 4.0.x ✅
حملات جعل درخواست متقابل (CSRF) کاربران را فریب می دهد تا در سایتی که احراز هویت شده اند، اقدامات ناخواسته انجام دهند. XOOPS حفاظت داخلی CSRF را از طریق کلاس XoopsSecurity فراهم می کند.
مستندات مرتبط
Section titled “مستندات مرتبط”- Security-Best-Practices - راهنمای جامع امنیتی
- Input-Sanitization - MyTextSanitizer و اعتبارسنجی
- SQL-Injection-Prevention - شیوه های امنیتی پایگاه داده
درک حملات CSRF
Section titled “درک حملات CSRF”حمله CSRF زمانی رخ می دهد که:
- یک کاربر در سایت XOOPS شما احراز هویت می شود
- کاربر از یک وب سایت مخرب بازدید می کند
- سایت مخرب با استفاده از جلسه کاربر درخواستی را به سایت XOOPS شما ارسال می کند
- سایت شما درخواست را طوری پردازش می کند که گویی از طرف کاربر قانونی آمده است
کلاس امنیت XOOPS
Section titled “کلاس امنیت XOOPS”XOOPS کلاس XoopsSecurity را برای محافظت در برابر حملات CSRF فراهم می کند. این کلاس توکن های امنیتی را مدیریت می کند که باید در فرم ها گنجانده شوند و هنگام پردازش درخواست ها تأیید شوند.
تولید توکن
Section titled “تولید توکن”کلاس امنیتی توکنهای منحصر به فردی تولید میکند که در جلسه کاربر ذخیره میشوند و باید در فرمهای زیر گنجانده شوند:
$security = new XoopsSecurity();
// Get token HTML input field$tokenHTML = $security->getTokenHTML();
// Get just the token value$tokenValue = $security->createToken();تایید رمز
Section titled “تایید رمز”هنگام پردازش فرم های ارسالی، تأیید کنید که رمز معتبر است:
$security = new XoopsSecurity();
if (!$security->check()) { redirect_header('index.php', 3, _MD_TOKENEXPIRED); exit();}با استفاده از سیستم توکن XOOPS
Section titled “با استفاده از سیستم توکن XOOPS”با کلاس های XoopsForm
Section titled “با کلاس های XoopsForm”هنگام استفاده از کلاسهای فرم XOOPS، محافظت توکن ساده است:
// Create a form$form = new XoopsThemeForm('Add Item', 'form_name', 'submit.php');
// Add form elements$form->addElement(new XoopsFormText('Title', 'title', 50, 255, ''));$form->addElement(new XoopsFormTextArea('Content', 'content', ''));
// Add hidden token field - ALWAYS include this$form->addElement(new XoopsFormHiddenToken());
// Add submit button$form->addElement(new XoopsFormButton('', 'submit', _SUBMIT, 'submit'));با فرم های سفارشی
Section titled “با فرم های سفارشی”برای فرمهای HTML سفارشی که از XoopsForm استفاده نمیکنند:
// In your form template or PHP file$security = new XoopsSecurity();?><form method="post" action="submit.php"> <input type="text" name="title" /> <textarea name="content"></textarea>
<!-- Include the token --> <?php echo $security->getTokenHTML(); ?>
<button type="submit">Submit</button></form>در قالب های هوشمند
Section titled “در قالب های هوشمند”هنگام تولید فرم ها در قالب های Smarty:
// In your PHP file$security = new XoopsSecurity();$GLOBALS['xoopsTpl']->assign('token', $security->getTokenHTML());{* In your template *}<form method="post" action="submit.php"> <input type="text" name="title" /> <textarea name="content"></textarea>
{* Include the token *} <{$token}>
<button type="submit">Submit</button></form>پردازش فرم های ارسالی
Section titled “پردازش فرم های ارسالی”تایید رمز اولیه
Section titled “تایید رمز اولیه”// In your form processing script$security = new XoopsSecurity();
// Verify the tokenif (!$security->check()) { redirect_header('index.php', 3, _MD_TOKENEXPIRED); exit();}
// Token is valid, process the form$title = $_POST['title'];// ... continue processingبا مدیریت خطای سفارشی
Section titled “با مدیریت خطای سفارشی”$security = new XoopsSecurity();
if (!$security->check()) { // Get detailed error information $errors = $security->getErrors();
// Log the error error_log('CSRF token validation failed: ' . implode(', ', $errors));
// Redirect with error message redirect_header('form.php', 3, 'Security token expired. Please try again.'); exit();}برای درخواست های AJAX
Section titled “برای درخواست های AJAX”هنگام کار با درخواست های AJAX، توکن را در درخواست خود قرار دهید:
// JavaScript - get token from hidden fieldvar token = document.querySelector('input[name="XOOPS_TOKEN_REQUEST"]').value;
// Include in AJAX requestfetch('ajax_handler.php', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded', }, body: 'action=save&XOOPS_TOKEN_REQUEST=' + encodeURIComponent(token)});// PHP AJAX handler$security = new XoopsSecurity();
if (!$security->check()) { echo json_encode(['error' => 'Invalid security token']); exit();}
// Process AJAX requestبررسی ارجاع HTTP
Section titled “بررسی ارجاع HTTP”برای محافظت بیشتر، به خصوص برای درخواست های AJAX، می توانید ارجاع دهنده HTTP را نیز بررسی کنید:
$security = new XoopsSecurity();
// Check referer headerif (!$security->checkReferer()) { echo json_encode(['error' => 'Invalid request']); exit();}
// Also verify the tokenif (!$security->check()) { echo json_encode(['error' => 'Invalid token']); exit();}بررسی امنیت ترکیبی
Section titled “بررسی امنیت ترکیبی”$security = new XoopsSecurity();
// Perform both checksif (!$security->checkReferer() || !$security->check()) { redirect_header('index.php', 3, 'Security validation failed'); exit();}پیکربندی توکن
Section titled “پیکربندی توکن”طول عمر رمز
Section titled “طول عمر رمز”توکن ها طول عمر محدودی برای جلوگیری از حملات تکراری دارند. میتوانید این را در تنظیمات XOOPS پیکربندی کنید یا توکنهای منقضی شده را به خوبی مدیریت کنید:
$security = new XoopsSecurity();
if (!$security->check()) { // Token may have expired // Regenerate form with new token redirect_header('form.php', 3, 'Your session has expired. Please submit the form again.'); exit();}چندین فرم در یک صفحه
Section titled “چندین فرم در یک صفحه”وقتی چندین فرم در یک صفحه دارید، هر کدام باید توکن خاص خود را داشته باشند:
// Form 1$form1 = new XoopsThemeForm('Form 1', 'form1', 'submit1.php');$form1->addElement(new XoopsFormHiddenToken('token1'));
// Form 2$form2 = new XoopsThemeForm('Form 2', 'form2', 'submit2.php');$form2->addElement(new XoopsFormHiddenToken('token2'));بهترین شیوه ها
Section titled “بهترین شیوه ها”همیشه از نشانه ها برای عملیات تغییر حالت استفاده کنید
Section titled “همیشه از نشانه ها برای عملیات تغییر حالت استفاده کنید”توکن ها را به هر شکلی که:
- ایجاد داده
- به روز رسانی داده ها
- داده ها را حذف می کند
- تنظیمات کاربر را تغییر می دهد
- انجام هرگونه اقدام اداری
فقط به بررسی ارجاع اعتماد نکنید
Section titled “فقط به بررسی ارجاع اعتماد نکنید”هدر ارجاع دهنده HTTP می تواند:
- حذف شده توسط ابزارهای حفظ حریم خصوصی
- در برخی از مرورگرها وجود ندارد
- در برخی موارد جعل شده است
همیشه از تأیید رمز به عنوان دفاع اصلی خود استفاده کنید.
توکن ها را به طور مناسب بازسازی کنید
Section titled “توکن ها را به طور مناسب بازسازی کنید”بازسازی توکن ها را در نظر بگیرید:
- پس از ارسال موفق فرم
- بعد از login/logout
- در فواصل منظم برای جلسات طولانی
انقضای توکن را به خوبی مدیریت کنید
Section titled “انقضای توکن را به خوبی مدیریت کنید”$security = new XoopsSecurity();
if (!$security->check()) { // Store form data temporarily $_SESSION['form_backup'] = $_POST;
// Redirect back to form with message redirect_header('form.php?restore=1', 3, 'Please resubmit the form.'); exit();}مسائل و راه حل های رایج
Section titled “مسائل و راه حل های رایج”خطای نشانه یافت نشد
Section titled “خطای نشانه یافت نشد”مشکل: بررسی امنیتی با “توکن یافت نشد” ناموفق است
راه حل: مطمئن شوید که فیلد نشانه در فرم شما گنجانده شده است:
$form->addElement(new XoopsFormHiddenToken());خطای منقضی شده توکن
Section titled “خطای منقضی شده توکن”مشکل: کاربران پس از تکمیل فرم طولانی، “توکن منقضی شده” را مشاهده می کنند
راه حل: استفاده از جاوا اسکریپت را برای به روز رسانی دوره ای توکن در نظر بگیرید:
// Refresh token every 10 minutessetInterval(function() { fetch('refresh_token.php') .then(response => response.json()) .then(data => { document.querySelector('input[name="XOOPS_TOKEN_REQUEST"]').value = data.token; });}, 600000);مشکلات توکن AJAX
Section titled “مشکلات توکن AJAX”مشکل: درخواست های AJAX اعتبار سنجی رمز را با شکست مواجه می کند
راه حل: مطمئن شوید که توکن با هر درخواست AJAX ارسال می شود و آن را در سمت سرور تأیید کنید:
// AJAX handlerheader('Content-Type: application/json');
$security = new XoopsSecurity();if (!$security->check(true, false)) { // Don't clear token for AJAX http_response_code(403); echo json_encode(['error' => 'Invalid token']); exit();}مثال: تکمیل فرم پیاده سازی
Section titled “مثال: تکمیل فرم پیاده سازی”<?phprequire_once dirname(__DIR__) . '/mainfile.php';
$security = new XoopsSecurity();
// Handle form submissionif ($_SERVER['REQUEST_METHOD'] === 'POST') { if (!$security->check()) { redirect_header('form.php', 3, 'Security token expired. Please try again.'); exit(); }
// Process valid submission $title = $myts->htmlSpecialChars($_POST['title']); // ... save to database
redirect_header('success.php', 3, 'Item saved successfully!'); exit();}
// Display form$GLOBALS['xoopsOption']['template_main'] = 'mymodule_form.tpl';include XOOPS_ROOT_PATH . '/header.php';
$form = new XoopsThemeForm('Add Item', 'add_item', 'form.php');$form->addElement(new XoopsFormText('Title', 'title', 50, 255, ''));$form->addElement(new XoopsFormTextArea('Content', 'content', ''));$form->addElement(new XoopsFormHiddenToken());$form->addElement(new XoopsFormButton('', 'submit', _SUBMIT, 'submit'));
$GLOBALS['xoopsTpl']->assign('form', $form->render());
include XOOPS_ROOT_PATH . '/footer.php';#امنیت #csrf #xoops #forms #tokens #XoopsSecurity