CSRF Koruma
2.5.x ✅ 4.0.x ✅
Siteler Arası İstek Sahteciliği (CSRF) saldırıları, kullanıcıları kimlik doğrulaması yapılan bir sitede istenmeyen eylemler gerçekleştirmeleri için kandırır. XOOPS, XoopsSecurity sınıfı aracılığıyla yerleşik CSRF koruması sağlar.
İlgili Belgeler
Section titled “İlgili Belgeler”- En İyi Güvenlik Uygulamaları - Kapsamlı güvenlik kılavuzu
- Giriş Temizleme - MyTextSanitizer ve doğrulama
- SQL-Enjeksiyon-Önleme - database güvenliği uygulamaları
CSRF Saldırılarını Anlamak
Section titled “CSRF Saldırılarını Anlamak”Bir CSRF saldırısı şu durumlarda meydana gelir:
- XOOPS sitenizde bir kullanıcının kimliği doğrulanır
- user kötü amaçlı bir web sitesini ziyaret eder
- Kötü amaçlı site, kullanıcının oturumunu kullanarak XOOPS sitenize bir istek gönderir
- Siteniz, isteği meşru kullanıcıdan gelmiş gibi işler
XoopsSecurity Sınıfı
Section titled “XoopsSecurity Sınıfı”XOOPS, CSRF saldırılarına karşı koruma sağlamak için XoopsSecurity sınıfını sağlar. Bu sınıf, formlara dahil edilmesi ve istekleri işlerken doğrulanması gereken güvenlik belirteçlerini yönetir.
Token Üretimi
Section titled “Token Üretimi”Güvenlik sınıfı, kullanıcının oturumunda saklanan ve formlara dahil edilmesi gereken benzersiz belirteçler oluşturur:
$security = new XoopsSecurity();
// Get token HTML input field$tokenHTML = $security->getTokenHTML();
// Get just the token value$tokenValue = $security->createToken();Jeton Doğrulaması
Section titled “Jeton Doğrulaması”Form gönderimlerini işlerken belirtecin geçerli olduğunu doğrulayın:
$security = new XoopsSecurity();
if (!$security->check()) { redirect_header('index.php', 3, _MD_TOKENEXPIRED); exit();}XOOPS Token Sistemini Kullanma
Section titled “XOOPS Token Sistemini Kullanma”XoopsForm Sınıfları ile
Section titled “XoopsForm Sınıfları ile”XOOPS form sınıflarını kullanırken jeton koruması basittir:
// 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'));Özel Formlarla
Section titled “Özel Formlarla”XoopsForm kullanmayan özel HTML formları için:
// 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>Smarty Şablonlarında
Section titled “Smarty Şablonlarında”Smarty şablonlarında formlar oluştururken:
// 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>Form Gönderimlerinin İşlenmesi
Section titled “Form Gönderimlerinin İşlenmesi”Temel Token Doğrulaması
Section titled “Temel Token Doğrulaması”// 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Özel Hata İşleme ile
Section titled “Özel Hata İşleme ile”$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 Talepleri için
Section titled “AJAX Talepleri için”AJAX istekleriyle çalışırken belirteci isteğinize ekleyin:
// 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 requestKontrol ediliyor HTTP Yönlendiren
Section titled “Kontrol ediliyor HTTP Yönlendiren”Özellikle AJAX isteklerine yönelik ek koruma için HTTP yönlendirenini de kontrol edebilirsiniz:
$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();}Birleşik Güvenlik Kontrolü
Section titled “Birleşik Güvenlik Kontrolü”$security = new XoopsSecurity();
// Perform both checksif (!$security->checkReferer() || !$security->check()) { redirect_header('index.php', 3, 'Security validation failed'); exit();}Belirteç Yapılandırması
Section titled “Belirteç Yapılandırması”Token Ömrü
Section titled “Token Ömrü”Tekrar saldırılarını önlemek için jetonların sınırlı bir ömrü vardır. Bunu XOOPS ayarlarında yapılandırabilir veya süresi dolmuş jetonları zarif bir şekilde yönetebilirsiniz:
$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();}Aynı Sayfada Birden Fazla Form
Section titled “Aynı Sayfada Birden Fazla Form”Aynı sayfada birden fazla formunuz olduğunda her birinin kendi belirteci olmalıdır:
// 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'));En İyi Uygulamalar
Section titled “En İyi Uygulamalar”Durum Değiştiren İşlemler İçin Her Zaman Tokenları Kullanın
Section titled “Durum Değiştiren İşlemler İçin Her Zaman Tokenları Kullanın”Aşağıdaki özelliklere sahip herhangi bir biçimde belirteçler ekleyin:
- Veri oluşturur
- Verileri günceller
- Verileri siler
- user ayarlarını değiştirir
- Her türlü idari işlemi gerçekleştirir
Yalnızca Yönlendiren Kontrolüne Güvenmeyin
Section titled “Yalnızca Yönlendiren Kontrolüne Güvenmeyin”HTTP yönlendiren başlığı şu şekilde olabilir:
- Gizlilik araçları tarafından soyuldu
- Bazı tarayıcılarda eksik
- Bazı durumlarda sahte
Her zaman birincil savunmanız olarak jeton doğrulamayı kullanın.
Tokenları Uygun Şekilde Yeniden Oluşturun
Section titled “Tokenları Uygun Şekilde Yeniden Oluşturun”Belirteçleri yeniden oluşturmayı düşünün:
- Başarılı form gönderiminden sonra
- login/logout’den sonra
- Uzun seanslar için düzenli aralıklarla
Token Sona Erme Tarihini İncelikle Yönetin
Section titled “Token Sona Erme Tarihini İncelikle Yönetin”$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();}Yaygın Sorunlar ve Çözümler
Section titled “Yaygın Sorunlar ve Çözümler”Belirteç Bulunamadı Hatası
Section titled “Belirteç Bulunamadı Hatası”Sorun: Güvenlik kontrolü “belirteç bulunamadı” nedeniyle başarısız oluyor
Çözüm: Belirteç alanının formunuza dahil edildiğinden emin olun:
$form->addElement(new XoopsFormHiddenToken());Belirtecin Süresi Doldu Hatası
Section titled “Belirtecin Süresi Doldu Hatası”Sorun: users formu uzun süre tamamladıktan sonra “belirtecin süresi doldu” ifadesini görüyor
Çözüm: Belirteci düzenli aralıklarla yenilemek için JavaScript kullanmayı düşünün:
// 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 Token Sorunları
Section titled “AJAX Token Sorunları”Sorun: AJAX istekleri jeton doğrulamasında başarısız oluyor
Çözüm: Belirtecin her AJAX isteğinde iletildiğinden emin olun ve bunu sunucu tarafında doğrulayın:
// 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();}Örnek: Formu Tamamlama Uygulaması
Section titled “Örnek: Formu Tamamlama Uygulaması”<?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';#security #csrf #xoops #forms #tokens #XoopsSecurity