Miałem ten sam problem, ale ze stronami, które były buforowane. Strony były buforowane nieaktualnym tokenem autentyczności, a wszystkie akcje przy użyciu metod post / put / delete, gdzie rozpoznano próby fałszerstwa. Użytkownik zwrócił błąd (422 Unprocessable Entity).
Rozwiązanie dla Rails 3:
Dodaj:
skip_before_filter :verify_authenticity_token
lub jak "sagivo" wskazano w Rails 4 dodaj:
skip_before_action :verify_authenticity_token
Na stronach obsługujących buforowanie.
Jak @toobulkeh skomentował to nie jest luka na :index
, :show
działań, ale uważaj na ten użyciem :put
, :post
działań.
Na przykład:
caches_page :index, :show
skip_before_filter :verify_authenticity_token, :only => [:index, :show]
Źródła: http://api.rubyonrails.org/classes/ActionController/RequestForgeryProtection/ClassMethods.html
Uwaga dodana przez barlop- Rails 4.2 przestarzałe skip_before_filter na rzecz skip_before_action https://guides.rubyonrails.org/4_2_release_notes.html "Rodzina metod * _filter została usunięta z dokumentacji. Odradza się ich używanie na rzecz * _action rodzina metod "
W przypadku Rails 6 (jak wskazał "collimarco") możesz go używać skip_forgery_protection
i że jest to bezpieczne w przypadku REST API, które nie używa danych sesji.
skip_before_action :verify_authenticity_token
:index, :show
działaniach. Ale uważaj, aby to zrobić:put, :post
!Dla mnie przyczyną tego problemu w Rails 4 był brak,
Linia w moim głównym układzie aplikacji. Przypadkowo usunąłem go, przepisując mój układ.
Jeśli tego nie ma w głównym układzie, będziesz go potrzebować na dowolnej stronie, na której chcesz umieścić token CSRF.
źródło
Istnieje kilka przyczyn tego błędu (dotyczy to Rails 4).
1. Sprawdź, czy jest
<%= csrf_meta_tags %>
obecny w układzie strony.2. Sprawdź, czy token autentyczności jest wysyłany z wywołaniami AJAX, jeśli używasz
form_for
pomocnika zremote: true
opcją. Jeśli nie, możesz dołączyć linię<%= hidden_field_tag :authenticity_token, form_authenticity_token %>
do bloku formularza.3. Jeśli żądanie jest wysyłane ze strony buforowanej, użyj buforowania fragmentów, aby wykluczyć część strony, która wysyła żądanie, np.
button_to
Itp. W przeciwnym razie token będzie nieaktualny / nieprawidłowy.Nie chciałbym anulować ochrony CSRF ...
źródło
Samo dodanie
authenticity_token
formularza naprawiło to za mnie.źródło
Token autentyczności to losowa wartość generowana w Twoim widoku, aby udowodnić, że żądanie zostało przesłane z formularza w Twojej witrynie, a nie gdzie indziej. Chroni to przed atakami CSRF:
http://en.wikipedia.org/wiki/Cross-site_request_forgery
Sprawdź, kim jest ten klient / adres IP, wygląda na to, że korzysta z Twojej witryny bez ładowania Twoich widoków.
Jeśli chcesz dalej debugować, to pytanie jest dobrym miejscem do rozpoczęcia: Zrozumienie tokenu autentyczności Rails
Zredagowano w celu wyjaśnienia: oznacza to, że wywołują akcję przetwarzania przesłania formularza bez renderowania formularza w witrynie. Może to być złośliwe (na przykład publikowanie komentarzy spamowych) lub może wskazywać, że klient próbuje bezpośrednio korzystać z interfejsu API usługi sieciowej. Tylko Ty możesz odpowiedzieć na to pytanie ze względu na charakter Twojego produktu i analizę Twoich żądań.
źródło
ActionController::InvalidAuthenticityToken
może być również spowodowany błędną konfiguracją zwrotnego serwera proxy. Dzieje się tak, jeśli w śladzie stosu pojawi się linia wyglądająca jakRequest origin does not match request base_url
.Podczas korzystania z odwrotnego proxy (takiego jak nginx) jako odbiornika dla żądania HTTPS i przesyłania żądania w postaci niezaszyfrowanej do zaplecza (takiego jak aplikacja Rails), zaplecze (dokładniej: Rack) oczekuje niektórych nagłówków z większą ilością informacji o pierwotnym żądaniu klienta aby móc stosować różne zadania przetwarzania i środki bezpieczeństwa.
Więcej szczegółów można znaleźć tutaj: https://github.com/rails/rails/issues/22965 .
TL; DR: rozwiązaniem jest dodanie kilku nagłówków:
źródło
za późno na odpowiedź, ale znalazłem rozwiązanie.
Definiując swój własny formularz html, brakuje ciągu tokena uwierzytelniania, który powinien zostać wysłany do kontrolera ze względów bezpieczeństwa. Ale kiedy używasz helpera formularza rails do generowania formularza, otrzymujesz coś w rodzaju śledzenia
Więc rozwiązaniem problemu jest albo dodanie pola authentication_token, albo użycie pomocników formularza rails zamiast usuwania, obniżania lub modernizacji szyn.
źródło
Jeśli zrobiłeś
rake rails:update
lub niedawno zmieniłeś swojeconfig/initializers/session_store.rb
, może to być objaw starych plików cookie w przeglądarce. Mam nadzieję, że odbywa się to na etapie tworzenia / testowania (to było dla mnie) i możesz po prostu wyczyścić wszystkie pliki cookie przeglądarki związane z daną domeną.Jeśli to jest w produkcji i zostało zmienione
key
, rozważ zmianę z powrotem na używanie starych plików cookie (<- tylko spekulacje).źródło
Miałem ten problem z połączeniami javascript. Naprawiłem to, wymagając tylko jquery_ujs w pliku application.js.
źródło
Mieliśmy ten sam problem, ale zauważyliśmy, że dotyczy to tylko żądań używających http: //, a nie https: //. Przyczyną była
secure: true
sesja_store:Naprawiono przy użyciu HTTPS ~ wszędzie :)
źródło
rails s
(bez SSL) zamiast punktu końcowego SSL, który skonfigurowałem do programowania. Dopiero gdy przeczytałem twój komentarz, zdałem sobie sprawę, co robię. Gdy wróciłem do korzystania z SSL, wszystko zaczęło działać ponownie. Dzięki!secure: true
pisaćsecure: !Rails.env.development?
W przypadku szyn 5 lepiej dodać
protect_from_forgery prepend: true
niż pominąćverify_authentication_token
źródło
Dodaj
w
źródło
Miałem ten problem, a powodem było to, że skopiowałem i wkleiłem kontroler do mojej aplikacji. Musiałem zmienić
ApplicationController
naApplicationController::Base
źródło
Miałem ten sam problem na hoście lokalnym. Zmieniłem domenę aplikacji, ale w adresach URL i pliku hostów nadal była stara domena. Zaktualizowałem moje zakładki przeglądarki i plik hostów, aby używać nowej domeny i teraz wszystko działa dobrze.
źródło
Może masz konfigurację NGINX dla HTTPS, ale Twoje certyfikaty są nieważne? W przeszłości miałem podobny problem i przekierowanie z http na https rozwiązało problem
źródło
Sprawdziłem, czy <% = csrf_meta_tags%> są obecne i wyczyszczenie plików cookie w przeglądarce zadziałało.
źródło
Zgodnie z zaleceniami Chrome Lighthouse dotyczącymi szybszego ładowania aplikacji, zsynchronizowałem mój JavaScript:
views/layout/application.html.erb
To zepsuło wszystko i spowodowało błąd tokena dla moich zdalnych formularzy. Usunięcie
async: true
rozwiązało problem.źródło
Ta odpowiedź jest znacznie bardziej specyficzna dla Ruby on Rails, ale miejmy nadzieję, że komuś pomoże.
Musisz dołączyć token CSRF do każdego żądania innego niż GET. Jeśli jesteś przyzwyczajony do używania JQuery, Railsy mają bibliotekę pomocniczą o nazwie,
jquery-ujs
która buduje się na niej i dodaje pewne ukryte funkcje. Jedną z rzeczy, które robi, jest automatyczne dołączanie tokenu CSRF do każdegoajax
żądania. Zobacz tutaj .Jeśli odejdziesz od tego tak, jak ja, możesz znaleźć się z błędem. Możesz po prostu przesłać token ręcznie lub użyć innej biblioteki, aby pomóc wydobyć token z DOM. Więcej szczegółów znajdziesz w tym poście .
źródło
W railsach 5 musimy dodać 2 linie kodu
źródło
Instalowanie
może pomóc
źródło
Problem rozwiązany przez obniżenie wersji do 2.3.5 z 2.3.8. (a także niesławny problem „Jesteś przekierowywany”)
źródło