Co daje użycie ValidateAntiForgeryToken

0

Cześć, zastanawia mnie adnotacja [ValidateAntiForgeryToken]. Co praktycznie mogę osiągnąć, oznaczając tym metodę akcji? W jakich sytuacjach tej adnotacji najlepiej użyć? W każdej metodzie akcji obsługującej dane z jakiegoś formularza? I ostatnie pytanie, Czy samo użycie jej w kontrolerze wystarczy? Czy powinienem coś jeszcze zrobić w widoku?

[HttpPost]
        [ValidateAntiForgeryToken]
        public IActionResult CreateNewResidentialObject(CreateResidentialObjectDTO createResidentialObjectDTO)
        {
            if(ModelState.IsValid)
                return RedirectToAction("Index", "PartnerPortal");

            return View();
        }
10

Scenariusz:

  • Masz w swojej aplikacji endpoint POST który pozwala e.g. usunąć wszystkie dokumenty powiedzmy POST /nuke/delete-all
  • Użytkownik Wacek zalogował się do twojej aplikacji. Uwierzytelnianie opera się na ciasteczkach.
  • Ale Wacek lubi sobie też xham**a pooglądać w pracy
  • Na stronce xxx wyświetla się reklama która w HTML ma osadzony formularz <form method=POST action=twoja.app/nuke/delete-all> z adresem twojego endpointu
  • Na document.onload JS w tej "reklamie" wysyła formularz; przeglądarka dołącza ciasteczka to tak działa HTTP
  • Wacek traci wszystkie swoje dokumenty

Ten atak nazywa się CSRF - Cross side request forgery (jest też serwer side; ale to inna bajka)

Problem można rozwiązać dodając do każdego żądania, które wysyła przeglądarka extra wartość np. header z ciągiem znaków.
Aplikacja dostaje taki ciąg, gdy Wacek się loguje i przechowuje go potem jako zmienną w JS lub ta wartość osadzana jest w<form> jako hidden input.
Każda inna strona otwarta w przeglądarce nie ma dostępu do tej wartości.
Aplikacja musi weryfikować, czy przesłana wartość (czyli CSRF token) jest poprawna. Wtedy opisany scenariusz z reklamą xxx nie zadziala.

Polecam OWASP: https://owasp.org/www-community/attacks/csrf

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