•  0
  •  112

CodeIgniter 3 - csrf token and cache

Jak rozwiązać problem z tokenem i cachowaniem w frameworku CodeIgniter 3?

Tzw. tokeny mają na celu zabezpieczenie strony przed botami spamującymi na naszych stronach.

Działają one w ten sposób, iż przed wykonaniem operacji post/get, zwykle w kontrolerze generowany jest hash kod z określoną żywotnością, który powinien zostać wysłany z formularzem, podczas akcji użytkownika.

Następnie podczas walidacji formularza sprawdzana jest jego prawidłowość. Jeśli tokena nie ma lub jest nieprawdiłowy, następuję błąd i akcja jest przerywana. Tak w bardzo dużym skrócie to działa.

Na czym polega problem?

Problem pojawia się wtedy, kiedy używamy cachowania naszej strony, co oznacza, że cały wyrenderowany kod zostaje zapisany i podczas kolejnych sesji odczytywany i przekazywany dalej (jeśli się nie przeterminował).

Jak można łatwo się domyślić w stronie wczytanej z pamięci znajduję się nieaktualny token, co na pewno zaowocuję wyrzuceniem błędu.

Spotkałem się z tym problemem podczas pracy nad własnym systemem zarządzania treścią - Altego, co commitowałem w repozytorium tegoż projektu.

Dobrym rozwiązaniem (ale na pewno nie najlepszym), jest uaktualnienie tokena w locie, co można zrobić np. w taki sposób:

$content = preg_replace ('<input type="hidden" name="' . $this->security->get_csrf_token_name () . '" value=".*?/>', 
'input type="hidden" name="' . $this->security->get_csrf_token_name () . '" value="' . $this->security->get_csrf_hash () . '"', $content);
Źródło:

Problem był commitowany w repozytorium CodeIgnitera, a przedstawione rozwiązanie jest autorstwa royduina.

Dodaj komentarz
Brak wyników.