Katakanlah Anda tidak ingin situs lain "membingkai" situs Anda di <iframe>
:
<iframe src="http://example.org"></iframe>
Jadi, Anda memasukkan JavaScript penghilang bingkai dan penghilang bingkai ke semua halaman Anda:
/* break us out of any containing iframes */
if (top != self) { top.location.replace(self.location.href); }
Luar biasa! Sekarang Anda "gagal" atau keluar dari iframe yang mengandung secara otomatis. Kecuali satu masalah kecil.
Ternyata, kode penghilang bingkai Anda dapat rusak , seperti yang ditunjukkan di sini :
<script type="text/javascript">
var prevent_bust = 0
window.onbeforeunload = function() { prevent_bust++ }
setInterval(function() {
if (prevent_bust > 0) {
prevent_bust -= 2
window.top.location = 'http://example.org/page-which-responds-with-204'
}
}, 1)
</script>
Kode ini melakukan hal berikut:
- menambahkan penghitung setiap kali browser mencoba bernavigasi menjauh dari halaman saat ini, melalui
window.onbeforeunload
pengendali acara - mengatur timer yang menyala setiap milidetik melalui
setInterval()
, dan jika itu melihat penghitung bertambah, mengubah lokasi saat ini ke server kontrol penyerang - server itu menyajikan halaman dengan kode status HTTP 204 , yang tidak menyebabkan browser bernavigasi ke mana pun
Pertanyaan saya adalah - dan ini lebih merupakan teka-teki JavaScript daripada masalah sebenarnya - bagaimana Anda bisa mengalahkan penghancur bingkai?
Saya memiliki beberapa pemikiran, tetapi tidak ada yang berhasil dalam pengujian saya:
- berusaha menghapus
onbeforeunload
acara melaluionbeforeunload = null
tidak berpengaruh - menambahkan proses yang
alert()
dihentikan biarkan pengguna tahu itu terjadi, tetapi tidak mengganggu kode dengan cara apa pun; mengklik OK memungkinkan penghilang berlanjut seperti biasa - Saya tidak bisa memikirkan cara untuk menghapus
setInterval()
timer
Saya bukan programmer JavaScript, jadi inilah tantangan saya untuk Anda: hei buster, bisakah Anda memecahkan frame-busting buster?
sumber
example.org
ditentukan dalam RFC 2606 ietf.org/rfc/rfc2606.txtJawaban:
Saya tidak yakin apakah ini layak atau tidak - tetapi jika Anda tidak dapat merusak frame, mengapa tidak hanya menampilkan peringatan. Sebagai contoh, Jika halaman Anda bukan "halaman atas" buat metode setInterval yang mencoba untuk memecahkan bingkai. Jika setelah 3 atau 4 mencoba halaman Anda masih bukan halaman atas - buat elemen div yang mencakup seluruh halaman (kotak modal) dengan pesan dan tautan seperti ...
Bukan yang terbaik, tapi saya tidak melihat cara apa pun mereka bisa skrip jalan keluar dari itu.
sumber
document.write("");
(setelah Anda memastikan bahwa itu sedang dibingkaiFWIW, kebanyakan browser saat ini mendukung para X-Frame-Options: menyangkal direktif, yang bekerja bahkan ketika script dinonaktifkan.
IE8:
http://blogs.msdn.com/ie/archive/2009/01/27/ie8-security-part-vi-clickjacking-defenses.aspx
Firefox (3.6.9)
https://bugzilla.mozilla.org/show_bug.cgi?id=475530
https://developer.mozilla.org/en/The_X-FRAME-OPTIONS_response_header
Chrome / Webkit
http://blog.chromium.org/2010/01/security-in-depth-new-security-features.html
http://trac.webkit.org/changeset/42333
sumber
Kami telah menggunakan pendekatan berikut di salah satu situs web kami dari http://seclab.stanford.edu/websec/framebusting/framebust.pdf
sumber
Datang dengan ini, dan tampaknya berfungsi setidaknya di Firefox dan browser Opera.
sumber
onbeforeunload
penangan, tidak hanya yang di atas!Mempertimbangkan standar HTML5 saat ini yang memperkenalkan sandbox untuk iframe, semua kode penghilang bingkai yang disediakan di halaman ini dapat dinonaktifkan ketika penyerang menggunakan sandbox karena membatasi iframe dari yang berikut:
Silakan lihat: http://www.whatwg.org/specs/web-apps/current-work/multipage/the-iframe-element.html#attr-iframe-sandbox
Sekarang, pertimbangkan penyerang menggunakan kode berikut untuk meng-host situs Anda di iframe:
Kemudian, semua kode penghilang bingkai JavaScript akan gagal.
Setelah memeriksa semua kode frame busing, hanya pertahanan ini yang berfungsi dalam semua kasus:
yang awalnya diusulkan oleh Gustav Rydstedt, Elie Bursztein, Dan Boneh, dan Collin Jackson (2010)
sumber
Setelah merenungkan ini sebentar, saya percaya ini akan menunjukkan kepada mereka siapa bosnya ...
Menggunakan
_top
sebagai parameter target untukwindow.open()
akan meluncurkannya di jendela yang sama.sumber
sumber
Saya akan berani dan melemparkan topi saya ke atas cincin yang satu ini (kuno seperti itu), melihat berapa banyak downvotes yang bisa saya kumpulkan.
Ini adalah upaya saya, yang sepertinya berfungsi di mana saja saya telah mengujinya (Chrome20, IE8 dan FF14):
Saya menempatkan kode ini di
<head>
dan memanggilnya dari akhir<body>
untuk memastikan halaman saya diberikan sebelum mulai berdebat dengan kode berbahaya, tidak tahu apakah ini pendekatan terbaik, YMMV.Bagaimana cara kerjanya?
... Saya mendengar Anda bertanya - jawaban jujurnya adalah, saya tidak begitu tahu. Butuh banyak fudging untuk membuatnya bekerja di mana-mana yang saya uji, dan efek pastinya sedikit berbeda tergantung di mana Anda menjalankannya.
Inilah pemikiran di baliknya:
Untuk saya
http://mysite.tld/page-that-takes-a-while-to-load
(target XHR) saya menggunakan skrip PHP yang terlihat seperti ini:Apa yang terjadi?
Tidak bisakah Anda menghindari waktu tunggu di Chrome dan Firefox?
Sepertinya tidak. Pada awalnya saya mengarahkan XHR ke URL yang akan mengembalikan 404 - ini tidak berfungsi di Firefox. Kemudian saya mencoba
sleep(5);
pendekatan yang akhirnya saya dapatkan untuk jawaban ini, kemudian saya mulai bermain-main dengan panjang tidur dengan berbagai cara. Saya tidak dapat menemukan pola nyata untuk perilaku tersebut, tetapi saya menemukan bahwa jika terlalu pendek, khususnya Firefox tidak akan bermain bola (Chrome dan IE tampaknya berperilaku cukup baik). Saya tidak tahu apa definisi "terlalu pendek" secara nyata, tetapi 5 detik sepertinya bekerja setiap saat.Jika ada ninja Javascript yang lewat ingin menjelaskan sedikit lebih baik apa yang terjadi, mengapa ini (mungkin) salah, tidak dapat diandalkan, kode terburuk yang pernah mereka lihat dll. Saya akan dengan senang hati mendengarkan.
sumber
Mulai 2015, Anda harus menggunakan
frame-ancestors
arahan CSP2 untuk ini. Ini diimplementasikan melalui header respons HTTP.misalnya
Tentu saja, belum banyak browser yang mendukung CSP2, jadi sebaiknya sertakan
X-Frame-Options
header lama :Saya akan menyarankan untuk memasukkan keduanya, jika tidak, situs Anda akan terus rentan terhadap serangan Clickjacking di browser lama, dan tentu saja Anda akan mendapatkan framing yang tidak diinginkan bahkan tanpa niat jahat. Sebagian besar browser melakukan pembaruan secara otomatis akhir-akhir ini, namun Anda masih cenderung membuat pengguna korporat terjebak pada versi Internet Explorer lama karena alasan kompatibilitas aplikasi lama.
sumber
Ok, jadi kita tahu bahwa itu ada dalam bingkai. Jadi kami location.href ke halaman khusus lain dengan path sebagai variabel GET. Kami sekarang menjelaskan kepada pengguna apa yang sedang terjadi dan memberikan tautan dengan opsi target = "_ TOP". Ini sederhana dan mungkin akan berfungsi (belum mengujinya), tetapi membutuhkan beberapa interaksi pengguna. Mungkin Anda bisa menunjukkan situs yang menyinggung kepada pengguna dan membuat aula malu clicker ke situs Anda di suatu tempat .. Hanya sebuah ide, tapi itu bekerja malam hari ..
sumber
Semua solusi yang diusulkan secara langsung memaksa perubahan di lokasi jendela atas. Bagaimana jika pengguna menginginkan frame ada di sana? Misalnya frame teratas di gambar hasil mesin pencari.
Saya menulis prototipe di mana secara default semua input (tautan, formulir, dan elemen input) dinonaktifkan dan / atau tidak melakukan apa-apa saat diaktifkan.
Jika bingkai yang mengandung terdeteksi, input dibiarkan dinonaktifkan dan pesan peringatan ditampilkan di bagian atas halaman. Pesan peringatan berisi tautan yang akan membuka versi halaman yang aman di jendela baru. Ini mencegah halaman dari digunakan untuk clickjacking, sementara masih memungkinkan pengguna untuk melihat konten dalam situasi lain.
Jika tidak ada bingkai yang terdeteksi, input diaktifkan.
Ini kodenya. Anda perlu mengatur atribut HTML standar ke nilai aman dan menambahkan atribut tambahan yang berisi nilai aktual. Ini mungkin tidak lengkap dan untuk keamanan tambahan atribut tambahan (saya berpikir tentang penangan acara) mungkin harus diperlakukan dengan cara yang sama:
sumber
Ya, Anda dapat memodifikasi nilai penghitung, tetapi itu jelas merupakan solusi yang rapuh. Anda dapat memuat konten Anda melalui AJAX setelah Anda menentukan bahwa situs tersebut tidak berada dalam bingkai - juga bukan solusi yang hebat, tetapi mudah-mudahan menghindari menembakkan peristiwa sebelum unload (saya berasumsi).
Sunting: Ide lain. Jika Anda mendeteksi Anda berada dalam bingkai, minta pengguna untuk menonaktifkan javascript, sebelum mengklik tautan yang membawa Anda ke URL yang diinginkan (melewati querystring yang memungkinkan halaman Anda memberi tahu pengguna bahwa mereka dapat mengaktifkan kembali javascript setelah mereka ada).
Sunting 2: Go nuklir - jika Anda mendeteksi Anda berada dalam bingkai, cukup hapus konten isi dokumen Anda dan cetak beberapa pesan yang tidak menyenangkan.
Sunting 3: Dapatkah Anda menyebutkan dokumen paling atas dan mengatur semua fungsi menjadi nol (bahkan yang anonim)?
sumber
<body>
dalam<plaintext>
tag diatur kedisplay: none
. Ini cukup efektif.Jika Anda menambahkan lansiran tepat setelah kode buster, maka lansiran akan menghentikan utas javascript, dan itu akan membiarkan halaman dimuat. Inilah yang dilakukan oleh StackOverflow, dan ia meledak dari iframe saya, bahkan ketika saya menggunakan frame busting buster. Ini juga berfungsi dengan halaman pengujian sederhana saya. Ini hanya diuji di Firefox 3.5 dan IE7 di windows.
Kode:
sumber
Saya pikir Anda hampir sampai. Sudahkah Anda mencoba:
atau, sebagai alternatif:
Catatan: Saya sebenarnya tidak menguji ini.
sumber
Bagaimana dengan memanggil buster berulang kali juga? Ini akan menciptakan kondisi balapan, tetapi orang mungkin berharap bahwa buster keluar di atas:
sumber
Jika Anda melihat nilai yang dikembalikan oleh
setInterval()
mereka biasanya satu digit, jadi Anda biasanya dapat menonaktifkan semua interupsi seperti itu dengan satu baris kode:sumber
Saya mungkin baru saja mendapatkan cara untuk mematahkan frame buster buster javascript. Menggunakan getElementsByName dalam fungsi javascript saya, saya telah menetapkan lingkaran antara frame buster dan skrip buster buster sebenarnya. lihat posting ini. http://www.phcityonweb.com/frame-buster-buster-buster-2426
sumber
setInterval dan setTimeout membuat interval yang bertambah secara otomatis. Setiap kali setTimeout atau setInterval dipanggil, angka ini naik satu, sehingga jika Anda memanggil setTimeout, Anda akan mendapatkan nilai saat ini, tertinggi.
Karena hampir tidak pernah ada 10.000 setInterval dan setTimeout yang bekerja secara simultan, dan karena setTimeout mengembalikan "interval atau batas waktu terakhir dibuat +1", dan karena top.clearInterval masih dapat diakses, ini akan mengalahkan serangan topi hitam ke bingkai situs web yang dijelaskan di atas.
sumber
Gunakan htaccess untuk menghindari frameset jacking tinggi, iframe dan konten seperti gambar.
Ini akan menampilkan halaman hak cipta alih-alih yang diharapkan.
sumber
<meta name="referrer" …/>
dan b) juga diatur saat mengklik tautan, jadi Anda juga melarang tautan ke halaman Anda dan memutuskan Web.