Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak zapobiegać zautomatyzowanym atakom AJAX

Wygląda na to, że Twój sprzeciw wobec pozostawienia sesji otwartej tak długo, jak przeglądarka jest otwarta, jest kwestią zautomatyzowanych ataków. Niestety, odświeżanie tokena przy każdym ładowaniu strony odstrasza tylko większość atakujących amatorów.

Po pierwsze, zakładam, że mówimy o atakach wymierzonych konkretnie w Twoją witrynę. (Jeśli mówimy o botach, które po prostu wędrują i przesyłają różne formularze, nie tylko ich to nie powstrzyma, ale są na to znacznie lepsze i łatwiejsze sposoby). strona, oto co zrobiłby mój bot:

  1. Załaduj stronę formularza.
  2. Odczytaj token na stronie formularza.
  3. Prześlij automatyczne żądanie za pomocą tego tokena.
  4. Przejdź do kroku 1.

(Lub, gdybym wystarczająco zbadał twój system, zdałbym sobie sprawę, że jeśli dołączę nagłówek „to jest AJAX” do każdego żądania, mógłbym zachować jeden token na zawsze. Albo zdałem sobie sprawę, że token jest moim identyfikatorem sesji i wyślij mój własny PHPSESSID plik cookie.)

Ta metoda zmiany tokena przy każdym ładowaniu strony nie zrobi absolutnie nic, aby powstrzymać kogoś, kto rzeczywiście chciał żeby cię tak bardzo zaatakować. Dlatego, ponieważ token nie ma wpływu na automatyzację, skup się na jego wpływie na CSRF.

Z perspektywy blokowania CSRF stworzenie jednego tokena i utrzymywanie go do momentu zamknięcia przeglądarki przez użytkownika wydaje się realizować wszystkie cele. Proste ataki CSRF są pokonywane, a użytkownik może otworzyć wiele kart.

TL;DR:Odświeżenie tokena raz na każde żądanie nie zwiększa bezpieczeństwa. Postaw na użyteczność i zrób jeden token na sesję.

Jednakże! Jeśli jesteś bardzo zaniepokojony zduplikowanymi przesłaniami formularzy, przypadkowymi lub w inny sposób, ten problem nadal można łatwo rozwiązać. Odpowiedź jest prosta:użyj dwóch tokenów do dwóch różnych zadań.

Pierwszy token pozostanie taki sam do końca sesji przeglądarki. Ten token istnieje, aby zapobiec atakom CSRF. Wszelkie zgłoszenia tego użytkownika z tym tokenem zostaną zaakceptowane.

Drugi token zostanie wygenerowany unikatowo dla każdego załadowanego formularza i będzie przechowywany na liście w danych sesji użytkownika otwartych tokenów formularza. Ten token jest unikalny i jest unieważniany po użyciu. Zgłoszenia tego użytkownika z tym tokenem zostaną zaakceptowane raz i tylko raz.

W ten sposób, jeśli otworzę zakładkę do formularza A i zakładkę do formularza B, każdy z nich ma mój osobisty token anty-CSRF (zadbałem o CSRF) i mój jednorazowy token formularza (zadbałem o ponowne przesłanie formularza). Oba problemy zostały rozwiązane bez negatywnego wpływu na wrażenia użytkownika.

Oczywiście możesz uznać, że to za dużo do zaimplementowania dla tak prostej funkcji. W każdym razie myślę, że tak. Niezależnie od tego istnieje solidne rozwiązanie, jeśli chcesz.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ustawienie portów map na 80 i 3306

  2. Jak usunąć zduplikowane rekordy w bazie mysql?

  3. Niewłaściwa liczba dni różnicy między 2 datami z czasem joda?

  4. Znaki zapytania Json (??????) zamiast hebrajskiego chars

  5. Jak mogę usunąć najstarsze wpisy w moim wyniku SQL?