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?
example.org
ditentukan dalam RFC 2606 ietf.org/rfc/rfc2606.txt