2015-06-01 10 views
27

Obecnie pracuję nad aplikacją Railsową z kilkoma innymi programistami, a na serwerze przesyłane są POST przez AJAX przez Angular. Od czasu do czasu zauważyliśmy kilka wyjątków od InvalidAuthenticityToken, które przechodzą przez nasze dzienniki poczty e-mail, co doprowadziło nas do podjęcia działań.Jaka jest różnica między null_session a reset_session w Railsach 4?

Ponieważ ten wniosek nadchodzi przez Angular, uważam, że traktujemy serwer jako API i powinniśmy używać protect_from_forgery with: :null_session. Jednak wydaje się, że protect_from_forgery with: :reset_session zapewnia nam tę samą rozdzielczość.

Nie chcę ślepo podłączać kodu tylko dlatego, że jest to zalecane, więc chciałbym poznać różnicę między tymi dwoma podejściami ochrony przed fałszerstwem. Kiedy powinienem używać jednego nad drugim i dlaczego miałbym preferować jego użycie?

+0

Podana odpowiedź jest dobra, ale polecam nurkowanie w tym głębsze, jeśli chcesz się upewnić, że naprawdę chronisz przed atakami CSRF. Jest kilka ważnych subtelności, które warto zauważyć. Oto kilka artykułów na blogu, które pomogły mi zrozumieć ryzyko, gdy miałem pytania dotyczące tego samego tematu: https://nvisium.com/blog/2014/09/10/understanding-protectfromforgery/ https: //blog.srcclr. com/when-rails-protect_from_forgery-fails/http://www.sitepoint.com/techniques-to-secure-your-website-with-ruby-on-rails-part-1/ Główne miejsce na wynos, które miałem było to, że są ins – aldefouw

Odpowiedz

37

podstawie moich interpretacji kodu, wydaje się, że:

  • null_session powinien być stosowany w sterownikach API stylu, w którym nie mają zastosowania dla obiektu sesji. To brzmi jak odpowiednie rozwiązanie dla Twojej aplikacji Angular. Sesja wcześniejsza użytkownika (tj. Ustawiona przez inne tradycyjne kontrolery) pozostanie nienaruszona. Jest to również domyślne zachowanie, jeśli nie podasz opcji with do protect_from_forgery.
  • reset_session jest dla tradycyjnych kontrolerów. Gdy sprawdzenie CSRF nie powiedzie się, informuje Rails, aby zdmuchnął sesję użytkownika i kontynuował obsługę żądania. To brzmi jak "tryb paranoidalny", w którym chcesz zalogować użytkownika z aplikacji, jeśli są jakieś dowody na ingerencję w żądanie.

Jeśli Twoja aplikacja Railsowa w ogóle nie korzysta z sesji, są one zamienne.

Jeśli jednak używasz sesji w niektórych częściach aplikacji, ale nie w innych (tj. W połączeniu z kontrolerami tradycyjnymi i interfejsami API), prawdopodobnie należy użyć null_session. W przeciwnym razie, jeśli użyjesz reset_session, żądanie API wykonane przez przeglądarkę spowoduje wylogowanie użytkowników z ich sesji przeglądarki.

+0

To ma sens. Jeśli scenariusz był taki, że zastosowano go na wyższym poziomie; to znaczy, jeśli to zostało zdefiniowane w klasie kontrolera nadrzędnego, który odziedziczył inny kontroler, czy to, co mówisz, nadal będzie obowiązywać? – Makoto

+1

Tak, na przykład, jeśli wszystkie kontrolery API dziedziczą z klasy nadrzędnej API :: BaseController, to w tej klasie bazowej zostanie wstawione 'protect_from_forgery z:: null_session' i będzie ono dotyczyć wszystkich kontrolerów, które z niego dziedziczą. Twoje kontrolery nie-API będą nadal otrzymywać domyślne zachowanie zdefiniowane przez 'ApplicationController' (' with:: exception'). –

+0

Idealne, tego właśnie szukałem. Dzięki za to. – Makoto

Powiązane problemy