Omówienie. Standardową radą jest użycie unikalnego tokena CSRF, który jest unikalny dla każdego żądania. Czemu? Ponieważ token na żądanie jest nieco bardziej odporny na niektóre rodzaje błędów implementacji niż token na sesję. To sprawia, że tokeny na żądanie są prawdopodobnie najlepszym wyborem do tworzenia nowych aplikacji internetowych. Żaden audytor bezpieczeństwa nie będzie też kłopotać się z używaniem tokena CSRF na żądanie.
Jeśli jesteś programistą aplikacji internetowych, to wszystko, co musisz wiedzieć i możesz przestać czytać tutaj. Ale jeśli jesteś ekspertem ds. Bezpieczeństwa i zastanawiasz się nad szczegółowym uzasadnieniem tej porady lub zastanawiasz się, jak duże jest ryzyko, jeśli używasz tokena na sesję, czytaj dalej ....
Zagłębianie się nieco głębiej. Prawda jest taka, że jeśli nie masz żadnych innych luk w swojej witrynie internetowej, pojedynczy token CSRF na sesję jest w porządku. Nie ma powodu, dla którego musisz mieć generować nowy token CSRF na żądanie.
Dowodzi tego fakt, że znajdziesz również renomowanych ekspertów ds. Bezpieczeństwa, którzy twierdzą, że inny rozsądny Sposobem obrony przed CSRF jest użycie podwójnego przesyłania plików cookie: innymi słowy, używasz kodu JavaScript po stronie klienta, który oblicza hash pliku cookie sesji i dodaje go do każdego żądania POST, traktując hash jako token CSRF. Możesz zobaczyć, że zasadniczo generuje to w locie token CSRF, który jest taki sam dla całej sesji.
Oczywiście znam argument, dlaczego niektórzy ludzie mogą zalecać generowanie nowego tokena CSRF dla każdego żądania. Myślą, że jeśli masz również lukę XSS w swojej witrynie, to jeśli użyjesz jednego tokena CSRF na sesję, łatwo będzie użyć XSS do odzyskania tokena CSRF, podczas gdy jeśli wygenerujesz nowy token CSRF na żądanie, zajmie więcej pracy, aby odzyskać token CSRF. Osobiście nie uważam tego za zbyt przekonujący argument. Jeśli masz lukę w zabezpieczeniach XSS w swojej witrynie, nadal można odzyskać tokeny CSRF, nawet jeśli wygenerujesz nowy token CSRF dla każdego żądania, wystarczy kilka dodatkowych wierszy złośliwego kodu JavaScript. Tak czy inaczej, jeśli masz lukę w zabezpieczeniach XSS w swojej witrynie i napotykasz poważnego, znającego się na rzeczy napastnika, trudno jest zagwarantować bezpieczeństwo, niezależnie od sposobu generowania tokenów CSRF.
Ogólnie rzecz biorąc, nie zaszkodzi aby wygenerować nowy token CSRF dla każdego żądania. I może lepiej zrobić to w ten sposób, żeby odciągnąć audytorów bezpieczeństwa. Ale jeśli masz już starszą aplikację, która używa jednego tokena CSRF przez całą sesję, wydanie pieniędzy na konwersję go w celu wygenerowania nowego tokena CSRF dla każdego żądania prawdopodobnie nie byłoby super wysoko na mojej liście priorytetów: Założę się, że mógłby znaleźć inne zastosowania dla tych pieniędzy i energii deweloperów, które jeszcze bardziej poprawiłyby bezpieczeństwo.