Implementuję aplikację Rails 4 z interfejsem API. Chcę móc wywoływać API z telefonów komórkowych i samej aplikacji internetowej. Natknąłem this note podczas badania protect_from_forgery
:Railsy 4 pomijam protect_from_forgery dla akcji API
Ważne jest, aby pamiętać, że wnioski XML lub JSON mają także wpływ, a jeśli budujemy API trzeba coś takiego:
class ApplicationController < ActionController::Base
protect_from_forgery
skip_before_action :verify_authenticity_token, if: :json_request?
protected
def json_request?
request.format.json?
end
end
Myślałem o zrobieniu tego, ale mam pewne zastrzeżenia/pytania:
- To rozwiązanie wydaje się pozostawić otwór CSRF otwarty, ponieważ teraz atakujący mógłby stworzyć łącze z javascriptem
onclick
, który wysyła JSON? - Czy sprawdzenie tokena API jest rozsądnym zamiennikiem? tj. co, jeśli zamiast pomijać sprawdzanie autentyczności, zezwalając mu na niepowodzenie sprawdzenia i odzyskać w
handle_unverified_request
, jeśli token APi jest obecny i poprawny dla bieżącego użytkownika? - A może powinienem zrobić tylko aplikację internetową i urządzenia mobilne send the CSRF token in the HTTP headers? Czy to jest bezpieczne? W jaki sposób telefon komórkowy otrzymałby nawet token CSRF, biorąc pod uwagę, że nie renderuje on formularzy HTML?
Edycja dla wyjaśnienia:
jestem bardziej zaniepokojony kliknięcie spreparowany odnośnik CSRF użytkownika webapp. Użytkownicy mobilni są uwierzytelniani, autoryzowani i mają klucz API, więc nie martwię się o nie. Jednak włączenie ochrony CSRF dla użytkowników aplikacji webapp uniemożliwia korzystanie z chronionego interfejsu API użytkownikom mobilnym. Chcę poznać prawidłową strategię obsługi tego i nie wierzę, że dokumentacja Rails daje właściwą odpowiedź.
Masz dwa różne scenariusze: aplikacje internetowe i aplikacje inne niż internetowe. CSRF działa tylko w aplikacjach internetowych, ponieważ atak zależy od wykorzystania istniejącej, prawidłowej sesji przeglądarki. Dlatego jeśli uwierzytelniasz się przy użyciu sesji przeglądarki, musisz użyć ochrony tokenu CSRF. Jeśli uwierzytelniasz za pomocą klucza API, nie możesz cierpieć z powodu CSRF, ponieważ nie istnieje żadna ważna sesja do sfałszowania. Jeśli używasz obu technik w tym samym interfejsie API, musisz użyć odpowiedniej metody dla każdego typu żądania. – toxaq