Unikalny token formularza wyłącza wielozadaniowość dla użytkownika

Jeśli chcę chronić moją witrynę i użytkowników przed atakami Cross Site Forgery (CSRF), mogę wygenerować unikalny token$token = md5( time() * rand ); nakażda strona który ma formę. Token jest przesyłany w ukrytym polu wejściowymecho '<input type="hidden" name="token" value="'.$token.'">'; i jednocześnie przechowywane w zmiennej sesji$_SESSION['token'] = $token;.

Sprawdzę, czy na przesłanym formularzuif($_POST['token'] == $_SESSION['token']) i postępuj zgodnie z nimi.

Jednak niektórzy użytkownicy mogą wykonywać wiele zadań jednocześnie. Co właśnie robię teraz, kiedy to publikuję.

Podczas komponowania mojego postu otwieram różne okna / karty, aby ewentualnie zbadać informacje lub spojrzeć na inne pytania dotyczące przepełnienia stosu. Przepełnienie stosu pozwala mi przesłać formularz bez żadnych problemów.

Ale jeśli miałbym to zrobić na mojej stronie robiąc to - co oznacza przeglądanie innych stron przy jednoczesnym komponowaniu postu / formularza - my$token będzie zregenerowany za każdym razem, gdy ściągnę inną stronę z mojej strony. Dokonywanie ukrytychinput token w formularzu, nad którym pracuję i ostatecznie chcę go przesłaćbłędny, ponieważ nie pasuje do$_SESSION['token'] zmienna, która została zregenerowana, gdy odwiedziłem inną stronę ...

Jakieś dobre pomysły, jak zapobiec temu problemowi, lub lepsze rozwiązania, aby zatrzymać CSRF?

Chcę zezwolić moim użytkownikom na wykonywanie wielu zadań ORAZ chęć ochrony przed CSRF ...

questionAnswers(2)

yourAnswerToTheQuestion