You are not logged in.

Announcement

 Téléchargez la dernière version stable de GLPI      -     Et vous, que pouvez vous faire pour le projet GLPI ? :  Contribuer
 Download last stable version of GLPI                      -     What can you do for GLPI ? :  Contribute

#1 2024-08-21 13:41:59

sinandogan
Member
Registered: 2024-08-21
Posts: 2

Form POST CSRF check failed

Hi, I developed a plugin and I want to take data from a form in index.php and add it to the database, but the csrf check fails, can you help me what am I missing?
Below you can find the codes of both pages.

index.php

<?php
include('../../../inc/includes.php');

global $DB;

// GLPI'nin oturum açma durumunu kontrol et
Session::checkLoginUser();


// CSRF token oluştur
$csrf_token = Session::getNewCSRFToken();


// Sayfa başlığı ve stil dosyası
Html::header(__('Ziyaretçi Takip Sistemi', 'guvenlik'), $_SERVER['PHP_SELF'], 'config');

// Kullanıcının adını alın
$userName = $_SESSION['glpiname'];

// Lokasyon belirleme
$lokasyon = ($userName === 'rguvenlik') ? 'Ring' : 'OE';

echo "Token: " . $csrf_token; // Test için token’ı ekrana yazdırıyoruz

try {
    $stmt = $DB->request('SELECT 1');
    echo '<br><a class="navigationheader-title strong text-success"><i class="fa-regular fa-circle-check"></i> Veri tabani baglantisi basarili.</a>';
} catch (Exception $e) {
    echo 'Bağlantı hatası: ' . $e->getMessage();
}

?>


<!DOCTYPE html>
<html lang="tr">
<head>
    <meta charset="UTF-8">
    <title>Güvenlik Giriş-Çıkış Takip Sistemi</title>
   <link rel="stylesheet" href="https://cdn.datatables.net/1.13.4/css/jquery.dataTables.min.css">
    <link rel="stylesheet" href="https://cdn.datatables.net/buttons/2.3.6/css/buttons.dataTables.min.css">
    <script src="https://cdn.datatables.net/plug-ins/1.13.4/i18n/tr.json"></script>
   <style>
        .date-icon {
            margin-right: 8px;
        }
        td.dataTables_empty {
            text-align: center;
        }
        .group {
            background-color: #f9f9f9;
            font-weight: bold;
            padding: 10px;
            cursor: pointer;
        }
    </style>
</head>
<body>
    <div id="page">
        <main>
               <h1 style="margin-top:50px" class="text-warning"><i class="fa-solid fa-person-military-to-person"></i> Ziyaretçi Kayıt Sistemi</h1>
            
            <form id="veri-form" style="margin-top:50px">
                <label for="giris_tarihi">Giriş Tarihi:</label>
                <input type="datetime-local" id="giris_tarihi" name="giris_tarihi" required>
                
                <label for="cikis_tarihi">Çıkış Tarihi:</label>
                <input type="datetime-local" id="cikis_tarihi" name="cikis_tarihi" required>
                
                <label for="personel_misafir">Personel/Misafir:</label>
                <select id="personel_misafir" name="personel_misafir" required>
                    <option value="personel">Personel</option>
                    <option value="misafir">Misafir</option>
                </select>
                
                <label for="arac_plaka">Araç Plaka:</label>
                <input type="text" id="arac_plaka" name="arac_plaka" required>

                 <!-- Gizli alan -->
                <input type="hidden" id="lokasyon" name="lokasyon" value="<?php echo htmlspecialchars($lokasyon); ?>">
                
                <!-- CSRF token'ı gizli alanda ekle -->
                       <input type="hidden" id="_glpi_csrf_token" name="_glpi_csrf_token" value="<?php echo $csrf_token; ?>">
                
                <button class="btn btn-primary me-2" type="submit"><i class="far fa-save"></i> <span>Kaydet</span></button>
            
            </form>

            <h2 style="margin-top:50px">Giriş-Çıkış Kayıtları</h2>
          <table id="veri-tablosu" class="display nowrap" style="width:100%">
                <thead>
                    <tr>
                        <th>Giriş Tarihi</th>
                        <th>Çıkış Tarihi</th>
                        <th>Personel/Misafir</th>
                        <th>Araç Plaka</th>
                    </tr>
                </thead>
                <tbody></tbody>
            </table>
        </main>
    </div>

    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
    <script src="https://cdn.datatables.net/1.13.4/js/jquery.dataTables.min.js"></script>
    <script src="https://cdn.datatables.net/buttons/2.3.6/js/dataTables.buttons.min.js"></script>
    <script src="https://cdn.datatables.net/buttons/2.3.6/js/buttons.html5.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.2.2/jszip.min.js"></script> <!-- Excel için JSZip -->
    <script src="https://cdn.datatables.net/buttons/2.3.6/js/buttons.print.min.js"></script>
    <script>
        $(document).ready(function() {
            function formatDate(dateString) {
    const options = { 
        year: 'numeric', 
        month: 'long', 
        day: 'numeric', 
        hour: '2-digit', 
        minute: '2-digit', 
        second: '2-digit',
        hour12: false // 24 saat formatını kullanmak için
    };
    return new Date(dateString).toLocaleDateString('tr-TR', options);
}            var table = $('#veri-tablosu').DataTable({
                ajax: 'ajax_listele.php',
                columns: [
                    { data: 'giris_tarihi', render: function(data) { return `<i class="fas fa-sign-in-alt date-icon"></i> ${formatDate(data)}`; } },
                    { data: 'cikis_tarihi', render: function(data) { return `<i class="fas fa-sign-out-alt date-icon"></i> ${formatDate(data)}`; } },
                    { data: 'personel_misafir' },
                    { data: 'arac_plaka' }
                ],
                order: [[0, 'desc']],
                language: {
                    url: "//cdn.datatables.net/plug-ins/1.13.4/i18n/tr.json"
                },
                dom: 'Bfrtip',
                buttons: [
                    'copy', 'csv', 'excel', 'pdf', 'print'
                ],
                createdRow: function(row, data, dataIndex) {
                    // Giriş tarihinin sadece gün kısmını al
                    const group = formatDate(data.giris_tarihi);
                    $(row).addClass('child-row').attr('data-group', group);
                },
                drawCallback: function(settings) {
                    var api = this.api();
                    var rows = api.rows({ page: 'current' }).nodes();
                    var last = null;

                    api.column(0, { page: 'current' }).data().each(function(giris_tarihi, i) {
                        const group = formatDate(giris_tarihi);

                        if (last !== group) {
                            $(rows).eq(i).before(
                                `<tr class="collapsed-group" data-group="${group}"><td colspan="4"><i class="fa-solid fa-plus"></i> ${group}</td></tr>`
                            );

                            last = group;
                        }
                    });
                }
            });

            // Grupların açılıp kapanması
            $('#veri-tablosu tbody').on('click', '.collapsed-group', function() {
                var group = $(this).data('group');
                var isVisible = $(`tr[data-group="${group}"]`).not('.collapsed-group').first().is(':visible');
                
                $(`tr[data-group="${group}"]`).not('.collapsed-group').toggle(!isVisible);
                $(this).find('i').toggleClass('fa-plus fa-minus');
            });

           // Formun gönderilmesi
            $('#veri-form').on('submit', function(e) {
                e.preventDefault();

                var formData = new FormData(this);
                formData.append('_glpi_csrf_token', '<?php echo $csrf_token; ?>');
                fetch('ajax_ekle.php', {
                    method: 'POST',
                    body: formData
                })
                .then(response => response.json())
                .then(data => {
                    if (data.success) {
                        alert('Veri başarıyla eklendi.');
                        table.ajax.reload(); // Tabloyu yeniden yükle
                    } else {
                        alert(data.message || 'Veri ekleme başarısız.');
                    }
                })
                .catch(error => console.error('Hata:', error));
            });
        });
    </script>

</body>
</html>
<?php
Html::footer();
?>

Ajax_add.php

<?php
include('../../../inc/includes.php');

// GLPI oturum kontrolü
Session::checkLoginUser();

// CSRF doğrulaması
if (!Session::validateCSRF($_POST)) {
    echo json_encode(['success' => false, 'message' => 'CSRF doğrulaması başarısız.']);
    exit;
}

// Formdan gelen verileri al
$giris_tarihi = $_POST['giris_tarihi'] ?? null;
$cikis_tarihi = $_POST['cikis_tarihi'] ?? null;
$personel_misafir = $_POST['personel_misafir'] ?? null;
$arac_plaka = $_POST['arac_plaka'] ?? null;
$lokasyon = $_POST['lokasyon'] ?? null;

// Gerekli alanların doluluğunu kontrol et
if (!$giris_tarihi || !$cikis_tarihi || !$personel_misafir || !$arac_plaka) {
    echo json_encode(['success' => false, 'message' => 'Lütfen tüm alanları doldurun.']);
    exit;
}

try {
    // Veritabanına veri ekleme
    $DB->insert(
        'glpi_modul_veri',
        [
            'giris_tarihi' => $giris_tarihi,
            'cikis_tarihi' => $cikis_tarihi,
            'personel_misafir' => $personel_misafir,
            'arac_plaka' => $arac_plaka,
            'lokasyon' => $lokasyon // Eğer lokasyon ekleniyorsa
        ]
    );

    echo json_encode(['success' => true]);
} catch (Exception $e) {
    echo json_encode(['success' => false, 'message' => 'Veri ekleme hatası: ' . $e->getMessage()]);
}
?>

Offline

#2 2024-08-23 07:58:47

sinandogan
Member
Registered: 2024-08-21
Posts: 2

Re: Form POST CSRF check failed

Can anyone help me with this?

Offline

Board footer

Powered by FluxBB