Saya memiliki masalah yang sama tetapi dengan halaman yang di-cache halaman. Halaman mendapat buffered dengan token keaslian basi dan semua tindakan menggunakan metode post / put / delete yang diakui sebagai upaya pemalsuan. Kesalahan (422 Entitas yang tidak dapat diproses) dikembalikan ke pengguna.
Solusi untuk Rails 3:
Tambahkan:
skip_before_filter :verify_authenticity_token
atau seperti yang "sagivo" tunjukkan di Rails 4 tambahkan:
skip_before_action :verify_authenticity_token
Pada halaman yang melakukan caching.
Sebagai @toobulkeh berkomentar ini bukan kerentanan pada :index
, :show
tindakan, tapi berhati-hatilah menggunakan ini pada :put
, :post
tindakan.
Sebagai contoh:
caches_page :index, :show
skip_before_filter :verify_authenticity_token, :only => [:index, :show]
Referensi: http://api.rubyonrails.org/classes/ActionController/RequestForgeryProtection/ClassMethods.html
Catatan ditambahkan oleh barlop- Rails 4.2 usang skip_before_filter yang mendukung skip_before_action https://guides.rubyonrails.org/4_2_release_notes.html "Metode keluarga * _filter telah dihapus dari dokumentasi. Penggunaannya tidak disarankan untuk mendukung * _action. keluarga metode "
Untuk Rails 6 (seperti yang ditunjukkan "collimarco") Anda dapat menggunakan skip_forgery_protection
dan aman untuk menggunakannya untuk REST API yang tidak menggunakan data sesi.
skip_before_action :verify_authenticity_token
:index, :show
tindakan. Tapi hati-hati dalam melakukan ini:put, :post
!Bagi saya penyebab masalah ini di bawah Rails 4 adalah hilang,
Baris dalam tata letak aplikasi utama saya. Saya tidak sengaja menghapusnya ketika saya menulis ulang tata letak saya.
Jika ini tidak ada di tata letak utama Anda akan membutuhkannya di halaman yang Anda inginkan token CSRF.
sumber
Ada beberapa penyebab kesalahan ini, (terkait dengan Rails 4).
1. Periksa
<%= csrf_meta_tags %>
hadir dalam tata letak halaman2. periksa token keaslian sedang dikirim dengan panggilan AJAX jika menggunakan
form_for
penolong denganremote: true
opsi. Jika tidak, Anda dapat menyertakan baris<%= hidden_field_tag :authenticity_token, form_authenticity_token %>
dalam blok formulir.3. Jika permintaan dikirim dari halaman yang di-cache, gunakan caching fragmen untuk mengecualikan bagian dari halaman yang mengirimkan permintaan misalnya
button_to
dll. Jika token akan basi / tidak valid.Saya akan enggan untuk membatalkan perlindungan csrf ...
sumber
Hanya menambahkan
authenticity_token
formulir dalam memperbaikinya untuk saya.sumber
Token keaslian adalah nilai acak yang dihasilkan dalam tampilan Anda untuk membuktikan bahwa permintaan diajukan dari formulir di situs Anda, bukan di tempat lain. Ini melindungi terhadap serangan CSRF:
http://en.wikipedia.org/wiki/Cross-site_request_forgery
Periksa untuk melihat siapa klien / IP itu, sepertinya mereka menggunakan situs Anda tanpa memuat tampilan Anda.
Jika Anda perlu melakukan debug lebih lanjut, pertanyaan ini adalah tempat yang baik untuk memulai: Memahami Token Keaslian Rails
Diedit untuk menjelaskan: Ini berarti mereka memanggil tindakan untuk memproses pengiriman formulir Anda tanpa pernah menyerahkan formulir Anda di situs web Anda. Ini bisa berbahaya (katakanlah mengeposkan komentar spam) atau itu bisa menunjukkan pelanggan mencoba menggunakan API layanan web Anda secara langsung. Hanya Anda yang dapat menjawabnya berdasarkan sifat produk Anda dan menganalisis permintaan Anda.
sumber
ActionController::InvalidAuthenticityToken
juga dapat disebabkan oleh proksi terbalik yang salah konfigurasi. Ini adalah kasus jika dalam jejak stack, Anda mendapatkan garis yang terlihat sepertiRequest origin does not match request base_url
.Saat menggunakan proksi terbalik (seperti nginx) sebagai penerima untuk permintaan HTTPS dan mengirimkan permintaan yang tidak dienkripsi ke backend (seperti aplikasi Rails), backend (lebih khusus: Rack) mengharapkan beberapa header dengan informasi lebih lanjut tentang permintaan klien asli agar dapat menerapkan berbagai tugas pemrosesan dan langkah-langkah keamanan.
Rincian lebih lanjut tersedia di sini: https://github.com/rails/rails/issues/22965 .
TL; DR: solusinya adalah menambahkan beberapa header:
sumber
sudah terlambat untuk menjawab tetapi saya menemukan solusinya.
Ketika Anda menentukan Anda memiliki bentuk html maka Anda kehilangan string token otentikasi yang harus dikirim ke controller untuk alasan keamanan. Tetapi ketika Anda menggunakan rel bentuk helper untuk menghasilkan formulir Anda mendapatkan sesuatu seperti mengikuti
Jadi solusi untuk masalah ini adalah dengan menambahkan bidang authenticity_token atau menggunakan rel bentuk helpers daripada menghapus, menurunkan, atau memutakhirkan rel.
sumber
Jika Anda telah
rake rails:update
atau baru-baru ini mengubah Andaconfig/initializers/session_store.rb
, ini mungkin merupakan gejala cookie lama di browser. Semoga ini dilakukan di dev / test (untuk saya), dan Anda bisa menghapus semua cookie browser yang terkait dengan domain yang dimaksud.Jika ini sedang dalam produksi, dan Anda berubah
key
, pertimbangkan untuk mengubahnya kembali untuk menggunakan cookie lama (<- hanya spekulasi).sumber
Saya punya masalah dengan panggilan javascript. Saya memperbaikinya dengan hanya memerlukan jquery_ujs ke file application.js.
sumber
Kami memiliki masalah yang sama, tetapi memperhatikan bahwa itu hanya untuk permintaan yang menggunakan http: // dan tidak dengan https: //. Penyebabnya adalah
secure: true
untuk session_store:Diperbaiki dengan menggunakan HTTPS ~ di mana saja :)
sumber
rails s
(non-SSL) alih-alih titik akhir SSL yang telah saya atur untuk pengembangan. Baru setelah saya membaca komentar Anda, saya menyadari apa yang saya lakukan. Setelah saya kembali menggunakan SSL, semuanya mulai berfungsi lagi. Terima kasih!secure: true
saya menulissecure: !Rails.env.development?
Untuk rel 5, lebih baik menambahkan
protect_from_forgery prepend: true
daripada melewatkanverify_authentication_token
sumber
Menambahkan
di
sumber
Saya punya masalah ini dan alasannya adalah karena saya menyalin dan menempelkan pengontrol ke aplikasi saya. Saya perlu untuk mengubah
ApplicationController
keApplicationController::Base
sumber
Saya memiliki masalah yang sama di localhost. Saya telah mengubah domain untuk aplikasi, tetapi dalam URL dan file host masih ada domain lama. Diperbarui bookmark browser dan file host saya untuk menggunakan domain baru dan sekarang semuanya berfungsi dengan baik.
sumber
Mungkin Anda memiliki pengaturan NGINX untuk HTTPS tetapi sertifikat Anda tidak valid? Saya pernah mengalami masalah yang sama di masa lalu dan mengalihkan dari http ke https memecahkan masalah
sumber
Saya telah memeriksa <% = csrf_meta_tags%> ada dan menghapus cookie di browser berfungsi untuk saya.
sumber
Mengikuti rekomendasi Chrome Lighthouse untuk memuat aplikasi yang lebih cepat, saya telah menyinkronkan Javascript saya:
views/layout/application.html.erb
Ini mematahkan segalanya dan mendapatkan kesalahan Token untuk formulir jarak jauh saya. Menghapus
async: true
memperbaiki masalah.sumber
Jawaban ini jauh lebih spesifik untuk Ruby on Rails, tetapi mudah-mudahan ini akan membantu seseorang.
Anda harus memasukkan token CSRF dengan setiap permintaan non-GET. Jika Anda terbiasa menggunakan JQuery, Rails memiliki pustaka penolong yang disebut
jquery-ujs
build di atasnya dan menambahkan beberapa fungsi tersembunyi. Salah satu hal yang dilakukannya adalah secara otomatis memasukkan token CSRF dalam setiapajax
permintaan. Lihat di sini .Jika Anda beralih dari itu seperti yang saya lakukan, Anda mungkin menemukan diri Anda dengan kesalahan. Anda bisa mengirimkan token secara manual atau menggunakan perpustakaan lain untuk membantu mengikis token dari DOM. Lihat posting ini untuk detail lebih lanjut.
sumber
Untuk lingkungan pengembangan, saya mencoba banyak dari upaya ini untuk memperbaiki masalah ini, di Rails 6. Tidak ada yang membantu. Jadi, jika tidak ada saran yang sesuai untuk Anda, coba di bawah ini.
Satu-satunya solusi yang saya temukan adalah menambahkan file txt ke folder / tmp Anda.
Di direktori root aplikasi Anda, jalankan:
Atau secara manual buat file dengan nama itu di folder / tmp Anda. Karena ini memperbaikinya untuk saya, saya menganggap akar masalah adalah konflik caching.
sumber
Di rails 5, kita perlu menambahkan 2 baris kode
sumber
Menginstal
bisa membantu
sumber
Masalah dipecahkan dengan menurunkan ke 2.3.5 dari 2.3.8. (Serta masalah terkenal 'Anda sedang diarahkan.')
sumber