Saya memiliki situs ASP.NET 4.0 IIS7.5 yang saya perlukan diamankan menggunakan header X-Frame-Options.
Saya juga perlu mengaktifkan halaman situs saya untuk di-ifram dari domain saya yang sama serta dari aplikasi facebook saya.
Saat ini saya memiliki situs saya yang dikonfigurasi dengan situs menuju:
Response.Headers.Add("X-Frame-Options", "ALLOW-FROM SAMEDOMAIN, www.facebook.com/MyFBSite")
Ketika saya melihat halaman Facebook saya dengan Chrome atau Firefox, halaman situs saya (dibingkai dengan halaman facebook saya) ditampilkan dengan baik, tetapi di bawah IE9, saya mendapatkan kesalahan:
"halaman ini tidak dapat ditampilkan…" (karena
X-Frame_Options
pembatasan).
Bagaimana cara mengatur X-Frame-Options: ALLOW-FROM
agar mendukung lebih dari satu domain?
X-FRAME-OPTION
menjadi fitur baru tampaknya memiliki kelemahan mendasar jika hanya satu domain yang dapat ditentukan.
Jawaban:
X-Frame-Options
sudah ditinggalkan. Dari MDN :Alternatif modern adalah
Content-Security-Policy
tajuk, yang bersama banyak kebijakan lain dapat membuat daftar putih URL apa yang diizinkan untuk menghosting laman Anda dalam sebuah bingkai, menggunakanframe-ancestors
arahan.frame-ancestors
mendukung banyak domain dan bahkan karakter pengganti, misalnya:Sayangnya, untuk saat ini, Internet Explorer tidak mendukung sepenuhnya Kebijakan Keamanan Konten .
UPDATE: MDN telah menghapus komentar penghentian mereka. Berikut komentar serupa dari Level Kebijakan Keamanan Konten W3C
sumber
X-Frame-Options
berubah, dan sekarang tidak terlalu parah. Ini adalah poin yang bagus bahwa berisiko menggunakan spesifikasi yang belum diselesaikan. Terima kasih!X-Frame-Options
tidak mendukung banyak sumber.Dari RFC 7034 :
Begitu,
Tidak boleh. Sebagai solusinya, Anda dapat menggunakan URL yang berbeda untuk mitra yang berbeda. Untuk setiap URL Anda dapat menggunakan
X-Frame-Options
nilainya sendiri . Sebagai contoh:Untuk
yousite.com
Anda bisa menggunakanX-Frame-Options: deny
.BTW , untuk saat ini Chrome (dan semua browser berbasis webkit) tidak mendukung
ALLOW-FROM
pernyataan sama sekali.sumber
ALLOW-FROM
penggunaan tautan yang Anda berikan.Necromancing.
Jawaban yang diberikan tidak lengkap.
Pertama, seperti yang telah dikatakan, Anda tidak dapat menambahkan beberapa host yang diizinkan, yang tidak didukung.
Kedua, Anda perlu mengekstrak nilai tersebut secara dinamis dari pengarah HTTP, yang berarti Anda tidak dapat menambahkan nilai ke Web.config, karena nilainya tidak selalu sama.
Deteksi browser perlu dilakukan untuk menghindari penambahan allow-from saat browser adalah Chrome (ini menghasilkan kesalahan pada konsol debug, yang dapat dengan cepat mengisi konsol, atau membuat aplikasi menjadi lambat). Itu juga berarti Anda perlu memodifikasi deteksi browser ASP.NET, karena salah mengidentifikasi Edge sebagai Chrome.
Ini dapat dilakukan di ASP.NET dengan menulis modul HTTP yang dijalankan pada setiap permintaan, yang menambahkan http-header untuk setiap respons, tergantung pada pengarah permintaan. Untuk Chrome, perlu menambahkan Content-Security-Policy.
Anda perlu mendaftarkan fungsi context_EndRequest dalam fungsi HTTP-module Init.
Selanjutnya Anda perlu menambahkan modul ke aplikasi Anda. Anda dapat melakukan ini secara terprogram di Global.asax dengan mengganti fungsi Init dari HttpApplication, seperti ini:
atau Anda dapat menambahkan entri ke Web.config jika Anda tidak memiliki kode sumber aplikasi:
Entri di system.webServer adalah untuk IIS7 +, yang lainnya di system.Web adalah untuk IIS 6.
Perhatikan bahwa Anda perlu menyetel runAllManagedModulesForAllRequests ke true, untuk itu berfungsi dengan baik.
Jenis string dalam format
"Namespace.Class, Assembly"
. Perhatikan bahwa jika Anda menulis rakitan Anda di VB.NET daripada C #, VB membuat Namespace default untuk setiap proyek, sehingga string Anda akan terlihat sepertiJika Anda ingin menghindari masalah ini, tulis DLL di C #.
sumber
Bagaimana dengan pendekatan yang tidak hanya memungkinkan beberapa domain, tetapi memungkinkan domain dinamis.
Kasus penggunaan di sini adalah dengan bagian aplikasi Sharepoint yang memuat situs kami di dalam Sharepoint melalui iframe. Masalahnya adalah sharepoint memiliki subdomain dinamis seperti https://yoursite.sharepoint.com . Jadi untuk IE, kita perlu menentukan ALLOW-FROM https: //.sharepoint.com
Bisnis yang rumit, tetapi kita dapat menyelesaikannya dengan mengetahui dua fakta:
Saat iframe dimuat, itu hanya memvalidasi X-Frame-Options pada permintaan pertama. Setelah iframe dimuat, Anda dapat menavigasi di dalam iframe dan header tidak diperiksa pada permintaan berikutnya.
Selain itu, saat iframe dimuat, pengarah HTTP adalah url iframe induk.
Anda dapat memanfaatkan dua sisi server fakta ini. Di ruby, saya menggunakan kode berikut:
Di sini kami dapat secara dinamis mengizinkan domain berdasarkan domain induk. Dalam kasus ini, kami memastikan bahwa host diakhiri dengan sharepoint.com yang menjaga situs kami aman dari pembajakan klik.
Saya ingin mendengar umpan balik tentang pendekatan ini.
sumber
/\.sharepoint\.com$/
Sesuai dengan Spesifikasi MDN ,
X-Frame-Options: ALLOW-FROM
tidak didukung di Chrome dan dukungan tidak diketahui di Edge dan Opera.Content-Security-Policy: frame-ancestors
menimpaX-Frame-Options
(sesuai spesifikasi W3 ini ), tetapiframe-ancestors
memiliki kompatibilitas terbatas. Sesuai dengan Spesifikasi MDN ini , itu tidak didukung di IE atau Edge.sumber
RFC untuk HTTP Header Field X-Frame-Options menyatakan bahwa kolom "ALLOW-FROM" di nilai header X-Frame-Options hanya dapat berisi satu domain. Beberapa domain tidak diperbolehkan.
RFC menyarankan solusi untuk masalah ini. Solusinya adalah dengan menentukan nama domain sebagai parameter url di url src iframe. Server yang menghosting url src iframe kemudian dapat memeriksa nama domain yang diberikan di parameter url. Jika nama domain cocok dengan daftar nama domain yang valid, maka server dapat mengirim header X-Frame-Options dengan nilai: "ALLOW-FROM domain-name", di mana nama domain adalah nama domain yang mencoba sematkan konten jarak jauh. Jika nama domain tidak diberikan atau tidak valid, maka header X-Frame-Options dapat dikirimkan dengan nilai: "deny".
sumber
Sebenarnya tidak, Anda tidak bisa.
Namun Anda dapat menentukan
X-Frame-Options: mysite.com
dan oleh karena itu mengizinkansubdomain1.mysite.com
dansubdomain2.mysite.com
. Tapi ya, itu masih satu domain. Kebetulan ada beberapa solusi untuk ini, tetapi saya pikir paling mudah untuk membacanya langsung di spesifikasi RFC: https://tools.ietf.org/html/rfc7034Perlu juga ditunjukkan bahwa
frame-ancestor
petunjuk header Content-Security-Policy (CSP) mengabaikan X-Frame-Options. Baca lebih lanjut di sini .sumber
Tidak persis sama, tetapi dapat berfungsi untuk beberapa kasus: ada opsi lain
ALLOWALL
yang secara efektif akan menghapus batasan, yang mungkin merupakan hal yang baik untuk lingkungan pengujian / pra-produksisumber
Saya harus menambahkan X-Frame-Options untuk IE dan Content-Security-Policy untuk browser lain. Jadi saya melakukan sesuatu seperti mengikuti.
sumber
Salah satu solusi yang mungkin adalah menggunakan skrip "pemecah bingkai" seperti yang dijelaskan di sini
Anda hanya perlu mengubah pernyataan "jika" untuk memeriksa domain Anda yang diizinkan.
Solusi ini akan aman, saya pikir. karena dengan javascript tidak diaktifkan Anda tidak akan memiliki masalah keamanan tentang situs web berbahaya yang membingkai halaman Anda.
sumber
IYA. Metode ini memungkinkan banyak domain.
VB.NET
sumber