Rails 4 tampaknya menyetel nilai default SAMEORIGIN
untuk X-Frame-Options
header respons HTTP. Ini bagus untuk keamanan, tetapi tidak memungkinkan sebagian dari aplikasi Anda tersedia di iframe
domain yang berbeda.
Anda dapat mengganti nilai X-Frame-Options
secara global menggunakan config.action_dispatch.default_headers
pengaturan:
config.action_dispatch.default_headers['X-Frame-Options'] = "ALLOW-FROM https://apps.facebook.com"
Tetapi bagaimana Anda menimpanya hanya untuk satu pengontrol atau tindakan?
ruby-on-rails
iframe
http-headers
ruby-on-rails-4
x-frame-options
Chris Peters
sumber
sumber
redirect_to
dan tindakan yang dialihkan akan membutuhkan ini untuk diterapkan. Apakah Anda mendapatkan kesalahan tertentu? Sepertinya pertanyaan baru yang bagus tentang Stack Overflow!after_action
sebelum itu dialihkan ke tindakan pengontrol terakhir yang mengarahkan keAngular
rute. Terima kasih!after_action
, meskipun akan berguna untuk melakukannya, misalnya diFrontend::BaseController
mana ini berlaku untuk seluruh frontend. Anda mungkin juga menjalankanresponse.headers.except! ...
dalam suatu tindakan.Saya hanya ingin menyertakan jawaban yang diperbarui di sini untuk siapa saja yang menemukan tautan ini ketika mencoba mencari cara untuk memungkinkan aplikasi Rails Anda disematkan dalam I-Frame dan mengalami masalah.
Saat menulis ini, 28 Mei 2020, perubahan X-Frame-Options mungkin bukan solusi terbaik Anda untuk masalah Anda. Opsi "IZINKAN DARI" sama sekali tidak diizinkan oleh semua browser utama.
Solusi modern adalah dengan mengimplementasikan Content-Security-Policy dan menyetel kebijakan 'frame_ancestors'. Kunci 'frame_ancestors' menunjukkan domain apa yang dapat menyematkan aplikasi Anda sebagai iframe. Saat ini didukung oleh browser utama dan menggantikan X-Frame-Options Anda. Ini akan memungkinkan Anda untuk mencegah Clickjacking (yang awalnya dimaksudkan untuk membantu X-Frame-Options sebelum sebagian besar menjadi usang) dan mengunci aplikasi Anda di lingkungan modern.
Anda dapat mengatur Kebijakan-Keamanan-Konten dengan Rails 5.2 di penginisialisasi (contoh di bawah), dan untuk Rails <5.2 Anda dapat menggunakan permata seperti permata Secure Headers: https://github.com/github/secure_headers
Anda juga dapat mengganti spesifikasi kebijakan berdasarkan pengontrol / tindakan jika Anda mau.
Content-Security-Policies sangat bagus untuk perlindungan keamanan tingkat lanjut. Lihat semua hal yang dapat Anda konfigurasikan di dokumen Rails: https://edgeguides.rubyonrails.org/security.html
Contoh Rails 5.2 untuk Content-Security-Policy:
# config/initializers/content_security_policy.rb Rails.application.config.content_security_policy do |policy| policy.frame_ancestors :self, 'some_website_that_embeds_your_app.com' end
Contoh perubahan khusus pengontrol untuk kebijakan:
# Override policy inline class PostsController < ApplicationController content_security_policy do |p| p.frame_ancestors :self, 'some_other_website_that_can_embed_posts.com' end end
sumber
p.frame_ancestors :self, -> { company&.allowed_domain || 'none' }
frame_ancestors
dan berfungsi di setiap browser, kecuali Safari. Ada wawasan?Untuk Rails 5+, gunakan
response.set_header('X-Frame-Options', 'ALLOW-FROM https://apps.facebook.com')
saja. Atau jikaALLOW-FROM
tidak berhasil dan Anda perlu perbaikan cepat, Anda dapat menyetelnya keALLOWALL
sumber