Zabezpieczenie CSRF zbyt skuteczne

0

Co mam nie tak:

session_start();

if (!isset($_SESSION['logged_in']) || $_SESSION['logged_in'] !== true) {
    header("Location: index.php");
    exit();
}


function generateCSRFToken() {
    return bin2hex(random_bytes(32));
}


if (!isset($_SESSION['csrf_token'])) {
   
    $_SESSION['csrf_token'] = generateCSRFToken();
}

// Sprawdzenie, czy token CSRF został przekazany w żądaniu AJAX
if (!isset($_POST['csrf_token']) || $_POST['csrf_token'] !== $_SESSION['csrf_token']) {
    
    http_response_code(403); 
    exit();
}


unset($_SESSION['csrf_token']);

 $.ajax({
                    url: url,
                    type: "GET",
                    data: { csrf_token: '<?php echo $_SESSION['csrf_token']; ?>' }, 
                    success: function(response) {
                      
                        $("#result").html(response);
                      
                        $('#selected-action-name').text(actionName);
                        $('.alert-primary').show();
                    },
                    error: function(xhr, status, error) {
                        console.error("Błąd AJAX: " + error);
                    }
                });

Od razu dostaję 403... Po wprowadzeniu tego kodu.
Jeśli loguję się na przeglądarce gdzie nie mam aktywnej sesji - to nie mogę się zalogować po wprowadzeniu danych dostaję błędne informacje, że strony nie ma ...
Co mam źle?

1
  1. 403 nie znaczy, że strony nie ma
  2. Zdebuguj sobie co dostajesz w post i w sesji.
0

nie mogę - bo od razu mnie blokuje

0
NieZnaju6 napisał(a):

nie mogę - bo od razu mnie blokuje

Znacz takie magiczne coś jak die()?

Albo zwyczajnie zakomentuj sobie to przekierowanie...

2

W Ajax masz type GET a w ifie potem sprawdzasz tablicę POST.

0

A ma być GET czy POST?

1

Ma być tak, jak chcesz.

Jak chcesz modyfikować jakieś dane to powinieneś użyć POST.

No i nie wiemy dokładnie czy ten kod to jest globalny kod, który obejmuje wszystkie podstrony? Czy w ogóle pozwalasz sobie wyświetlić jakiś front-end? 😀

0

Modyfikacje chodzi o dane przesyłane z formularza do bazy? Czy modyfikowanie danych przekazanych w SESJI?

0

Raczej chodzi o to, by pobierane dane nie zostały zapisane w pamięci podręcznej, co się dzieje zazwyczaj przy “GET”.

0

Wiesz, czemu ma służyć CSRF token?
Spróbuj przeczytać np. dokumentację z Laravel:
https://laravel.com/docs/11.x/csrf
Zastanów się, czy jeśli GET będziesz używał tylko do pobierania danych przez klienta, to czy jest sens stosowania tam takiego tokenu. Oczywiście jeśli będziesz chciał wykorzystać GET jednak do przesłania parametrów jakiegoś formularza (nie zalecane), to musisz rozważać też CSRF tam.

1 użytkowników online, w tym zalogowanych: 0, gości: 1