Saya mengirim data dari tampilan ke pengontrol dengan AJAX dan saya mendapat kesalahan ini:
PERINGATAN: Tidak dapat memverifikasi keaslian token CSRF
Saya pikir saya harus mengirim token ini dengan data.
Adakah yang tahu bagaimana saya bisa melakukan ini?
Sunting: Solusi saya
Saya melakukan ini dengan meletakkan kode berikut di dalam posting AJAX:
headers: {
'X-Transaction': 'POST Example',
'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content')
},
ruby-on-rails
jquery
csrf
kbaccouche
sumber
sumber
Jawaban:
Anda harus melakukan ini:
Pastikan Anda memiliki
<%= csrf_meta_tag %>
tata letak AndaTambahkan
beforeSend
ke semua permintaan ajax untuk mengatur header seperti di bawah ini:Untuk mengirim token di semua permintaan, Anda dapat menggunakan:
sumber
Cara terbaik untuk melakukan ini sebenarnya hanya digunakan
<%= form_authenticity_token.to_s %>
untuk mencetak token langsung di kode rel Anda. Anda tidak perlu menggunakan javascript untuk mencari dom untuk csrf token seperti yang disebutkan posting lainnya. cukup tambahkan opsi header seperti di bawah ini;sumber
Jika saya ingat dengan benar, Anda harus menambahkan kode berikut ke formulir Anda, untuk menghilangkan masalah ini:
Jangan lupa parameternya.
sumber
<%= token_tag(nil) %>
. Kemudian Anda mendapatkan token yang dibuat secara otomatis.Memang cara paling sederhana. Jangan repot-repot mengganti header.
Pastikan Anda memiliki:
Lakukan saja bidang input tersembunyi seperti:
Atau jika Anda ingin posting jQuery ajax:
sumber
Peningkatan versi dari aplikasi yang lebih lama ke rails 3.1, termasuk meta tag csrf masih belum menyelesaikannya. Di blog rubyonrails.org, mereka memberikan beberapa kiat pemutakhiran, dan khususnya jquery baris ini yang seharusnya ada di bagian kepala tata letak Anda:
diambil dari posting blog ini: http://weblog.rubyonrails.org/2011/2/8/csrf-protection-bypass-in-ruby-on-rails .
Dalam kasus saya, sesi sedang diatur ulang pada setiap permintaan ajax. Menambahkan kode di atas menyelesaikan masalah itu.
sumber
<%= csrf_meta_tag %>
tata letak AndabeforeSend
untuk memasukkan csrf-token dalam permintaan ajax untuk mengatur header. Ini hanya diperlukan untukpost
permintaan.Kode untuk membaca token csrf tersedia di
rails/jquery-ujs
, jadi imho paling mudah untuk hanya menggunakan itu, sebagai berikut:sumber
headers: { 'X-CSRF-Token': Rails.csrfToken() }
Saya hanya berpikir saya akan menautkan ini di sini karena artikel ini memiliki sebagian besar jawaban yang Anda cari dan juga sangat menarik
http://www.kalzumeus.com/2011/11/17/i-saw-an-extremely-subtle-bug-today-and-i-just-have-to-tell-someone/
sumber
Jawaban pilihan teratas di sini sudah benar tetapi tidak akan berfungsi jika Anda melakukan permintaan lintas-domain karena sesi tidak akan tersedia kecuali jika Anda secara eksplisit memberi tahu jQuery untuk meneruskan cookie sesi. Berikut cara melakukannya:
sumber
Anda dapat menulisnya secara global seperti di bawah ini.
JS normal:
Naskah Kopi:
sumber
Ups ..
Saya melewatkan baris berikut di application.js saya
Saya menggantinya dan berfungsi ..
======= DIPERBARUI =========
Setelah 5 tahun, saya kembali dengan kesalahan yang sama, sekarang saya memiliki Rails baru 5.1.6 , dan saya menemukan posting ini lagi. Persis seperti lingkaran kehidupan.
Sekarang yang menjadi masalah adalah: Rails 5.1 menghapus dukungan untuk jquery dan jquery_ujs secara default, dan ditambahkan
Itu melakukan hal-hal berikut:
Tapi mengapa itu tidak termasuk token csrf untuk permintaan ajax? Jika ada yang tahu tentang ini secara detail, beri komentar saja. Saya menghargai itu.
Lagi pula saya menambahkan yang berikut ini di file js khusus saya untuk membuatnya berfungsi (Terima kasih atas jawaban lain untuk membantu saya mencapai kode ini):
sumber
jquery_ujs
. Itulah triknya.Jika Anda tidak menggunakan jQuery dan menggunakan sesuatu seperti mengambil API untuk permintaan, Anda dapat menggunakan yang berikut ini untuk mendapatkan
csrf-token
:document.querySelector('meta[name="csrf-token"]').getAttribute('content')
sumber
Gunakan jquery.csrf ( https://github.com/swordray/jquery.csrf ).
Rel 5.1 atau yang lebih baru
Rails 5.0 atau sebelumnya
Kode sumber
sumber
//= require jquery.csrf
tidak akan berfungsi, kan ?. Sebaliknya saya menggunakan file paket js denganimport 'jquery.csrf'
di dalamnya. Catatan Anda tidak perlu menyertakan ini dengan tag paket dalam tampilan Anda.Jika Anda menggunakan javascript dengan jQuery untuk menghasilkan token di formulir Anda, ini berfungsi:
Jelas, Anda harus memiliki
<%= csrf_meta_tag %>
tata letak Ruby Anda.sumber
Bagi Anda yang membutuhkan jawaban non jQuery, Anda dapat dengan mudah menambahkan yang berikut:
Contoh yang sangat sederhana dapat dilihat di sini:
sumber
Saya berjuang dengan masalah ini selama berhari-hari. Setiap panggilan GET berfungsi dengan benar, tetapi semua PUT akan menghasilkan kesalahan "Tidak dapat memverifikasi keaslian token CSRF". Situs web saya berfungsi dengan baik sampai saya menambahkan sertifikat SSL ke nginx.
Saya akhirnya menemukan garis yang hilang ini di pengaturan nginx saya:
Setelah menambahkan baris yang hilang "proxy_set_header X-Forwarded-Proto https;", semua kesalahan token CSRF saya berhenti.
Semoga ini bisa membantu orang lain yang juga membenturkan kepalanya ke dinding. ha ha
sumber
jika seseorang membutuhkan bantuan terkait dengan Uploadify dan Rails 3.2 (seperti saya ketika saya meng-google-kan posting ini), aplikasi contoh ini mungkin membantu: https://github.com/n0ne/Uploadify-Carrierwave-Rails-3.2.3/blob/master /app/views/pictures/index.html.erb
juga periksa solusi pengontrol di aplikasi ini
sumber
Saya menggunakan Rails 4.2.4 dan tidak tahu mengapa saya mendapatkan:
Saya miliki dalam tata letak:
Di controller:
Memanggil
tcpdump -A -s 999 -i lo port 3000
menunjukkan tajuk sedang diset (meskipun tidak perlu mengatur tajuk denganajaxSetup
- sudah dilakukan):Pada akhirnya itu gagal karena cookie saya dimatikan. CSRF tidak berfungsi tanpa cookie diaktifkan, jadi ini kemungkinan penyebab lain jika Anda melihat kesalahan ini.
sumber