Przesyłam dane z widoku do kontrolera za pomocą AJAX i otrzymałem ten błąd:
OSTRZEŻENIE: Nie można zweryfikować autentyczności tokenu CSRF
Myślę, że muszę wysłać ten token z danymi.
Czy ktoś wie jak to zrobić?
Edycja: Moje rozwiązanie
Zrobiłem to, umieszczając następujący kod w poście AJAX:
headers: {
'X-Transaction': 'POST Example',
'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content')
},
ruby-on-rails
jquery
csrf
kbaccouche
źródło
źródło
Odpowiedzi:
Powinieneś to zrobić:
Upewnij się, że masz
<%= csrf_meta_tag %>
w swoim układzieDodaj
beforeSend
do wszystkich żądań ajax, aby ustawić nagłówek jak poniżej:Aby wysłać token we wszystkich żądaniach, możesz użyć:
źródło
Najlepszym sposobem na to jest po prostu
<%= form_authenticity_token.to_s %>
wydrukowanie tokena bezpośrednio w kodzie szyny. Nie musisz używać javascript do przeszukiwania domeny w poszukiwaniu tokena csrf, jak wspominają inne posty. po prostu dodaj opcję nagłówków, jak poniżej;źródło
Jeśli dobrze pamiętam, musisz dodać następujący kod do formularza, aby pozbyć się tego problemu:
Nie zapomnij parametru.
źródło
<%= token_tag(nil) %>
. Następnie otrzymasz automatycznie wygenerowany token.Rzeczywiście najprostszy sposób. Nie zawracaj sobie głowy zmienianiem nagłówków.
Upewnij się że masz:
Po prostu wykonaj ukryte pole wejściowe w następujący sposób:
Lub jeśli chcesz postu jQuery ajax:
źródło
Uaktualnienie ze starszej aplikacji do szyn 3.1, w tym metatag csrf, nadal go nie rozwiązuje. Na blogu rubyonrails.org podają kilka wskazówek dotyczących aktualizacji, aw szczególności tej linii jquery, która powinna znaleźć się w sekcji head twojego układu:
zaczerpnięte z tego postu na blogu: http://weblog.rubyonrails.org/2011/2/8/csrf-protection-bypass-in-ruby-on-rails .
W moim przypadku sesja była resetowana przy każdym żądaniu ajax. Dodanie powyższego kodu rozwiązało ten problem.
źródło
<%= csrf_meta_tag %>
w swoim układziebeforeSend
aby dołączyć token csrf do żądania ajax, aby ustawić nagłówek. Jest to wymagane tylko w przypadkupost
wniosków.Kod do odczytu tokena csrf jest dostępny w
rails/jquery-ujs
, więc imho najłatwiej jest po prostu z niego skorzystać w następujący sposób:źródło
headers: { 'X-CSRF-Token': Rails.csrfToken() }
Pomyślałem, że mogę to tutaj linkować, ponieważ artykuł zawiera większość odpowiedzi, której szukasz, i jest również bardzo interesujący
http://www.kalzumeus.com/2011/11/17/i-saw-an-extremely-subtle-bug-today-and-i-just-have-to-tell-someone/
źródło
Najczęściej głosowane odpowiedzi tutaj są poprawne, ale nie będą działać, jeśli wykonujesz żądania między domenami, ponieważ sesja nie będzie dostępna, chyba że wyraźnie powiesz jQuery, aby przekazała sesyjny plik cookie. Oto jak to zrobić:
źródło
Możesz napisać to globalnie, jak poniżej.
Normalny JS:
Skrypt kawy:
źródło
ups ..
W moim pliku application.js brakuje mi następującego wiersza
Wymieniłem go i działa.
======= AKTUALIZACJA =========
Po 5 latach wróciłem z tym samym błędem, teraz mam zupełnie nowe Railsy 5.1.6 i ponownie znalazłem ten post. Zupełnie jak krąg życia.
Problem polegał na tym, że Rails 5.1 domyślnie usunął obsługę jquery i jquery_ujs i dodał
Robi następujące rzeczy:
Ale dlaczego nie zawiera tokena csrf dla żądania ajax? Jeśli ktoś wie o tym szczegółowo, po prostu skomentuj mnie. Doceniam to.
W każdym razie dodałem następujące elementy do mojego niestandardowego pliku js, aby działał (dziękuję za inne odpowiedzi, które pomogą mi dotrzeć do tego kodu):
źródło
jquery_ujs
. To była sztuczka.Jeśli nie używasz jQuery i używasz czegoś takiego jak API pobierania dla żądań, możesz użyć następujących opcji, aby uzyskać
csrf-token
:document.querySelector('meta[name="csrf-token"]').getAttribute('content')
źródło
Użyj jquery.csrf ( https://github.com/swordray/jquery.csrf ).
Rails 5.1 lub nowszy
Railsy 5.0 lub wcześniejsze
Kod źródłowy
źródło
//= require jquery.csrf
nie zadziała, prawda ?. Zamiast tego użyłemimport 'jquery.csrf'
w nim pliku js paczki . Pamiętaj, że nie musisz dołączać tego do tagu pack w swoich widokach.Jeśli używasz javascript z jQuery do generowania tokena w formularzu, działa to:
Oczywiście musisz mieć
<%= csrf_meta_tag %>
w swoim układzie Ruby.źródło
Dla tych z Was, którzy potrzebują odpowiedzi innej niż jQuery, możesz po prostu dodać:
Bardzo prosty przykład może być tutaj:
źródło
Walczyłem z tym problemem przez wiele dni. Każde wywołanie GET działało poprawnie, ale wszystkie PUT generowałyby błąd „Nie można zweryfikować autentyczności tokenu CSRF”. Moja strona działała dobrze, dopóki nie dodałem certyfikatu SSL do nginx.
W końcu natknąłem się na tę brakującą linię w moich ustawieniach nginx:
Po dodaniu brakującej linii „proxy_set_header X-Forwarded-Proto https;” wszystkie moje tokeny CSRF zostały zamknięte.
Mam nadzieję, że pomoże to komuś, kto również uderza głową o ścianę. ha ha
źródło
jeśli ktoś potrzebuje pomocy związanej z Uploadify i Rails 3.2 (tak jak ja, gdy przejrzałem ten post), ta przykładowa aplikacja może być pomocna: https://github.com/n0ne/Uploadify-Carrierwave-Rails-3.2.3/blob/master /app/views/pictures/index.html.erb
sprawdź także rozwiązanie kontrolera w tej aplikacji
źródło
Korzystam z Rails 4.2.4 i nie mogłem zrozumieć, dlaczego otrzymałem:
Mam w układzie:
W kontrolerze:
Wywołanie
tcpdump -A -s 999 -i lo port 3000
pokazywało ustawiony nagłówek (mimo że nie trzeba ustawiać nagłówków za pomocąajaxSetup
- zostało to już zrobione):W końcu się nie udawało, ponieważ miałem wyłączone pliki cookie. CSRF nie działa bez włączonych plików cookie, więc jest to kolejna możliwa przyczyna tego błędu.
źródło