สมมติว่าคุณไม่ต้องการให้เว็บไซต์อื่น ๆ "ใส่เฟรม" ไซต์ของคุณใน<iframe>
:
<iframe src="http://example.org"></iframe>
ดังนั้นคุณจึงใส่ JavaScript ป้องกันการวางเฟรมลงในหน้าเว็บของคุณทั้งหมด:
/* break us out of any containing iframes */
if (top != self) { top.location.replace(self.location.href); }
ยอดเยี่ยม ตอนนี้คุณ "หยุด" หรือแยกออกจาก iframe ใด ๆ ที่มีโดยอัตโนมัติ ยกเว้นปัญหาเล็ก ๆ อย่างหนึ่ง
ในฐานะที่เป็นมันจะเปิดออกรหัสกรอบ busting ของคุณสามารถจับ , ตามที่แสดงไว้ที่นี่ :
<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>
รหัสนี้ทำดังต่อไปนี้:
- เพิ่มตัวนับทุกครั้งที่เบราว์เซอร์พยายามนำทางออกจากหน้าปัจจุบันผ่าน
window.onbeforeunload
ตัวจัดการเหตุการณ์ - ตั้งค่าตัวจับเวลาที่ยิงทุกมิลลิวินาทีผ่าน
setInterval()
และหากเห็นตัวนับเพิ่มขึ้นเปลี่ยนตำแหน่งปัจจุบันเป็นเซิร์ฟเวอร์ของการควบคุมของผู้โจมตี - เซิร์ฟเวอร์ดังกล่าวแสดงหน้าเว็บที่มีรหัสสถานะ HTTP 204ซึ่งไม่ทำให้เบราว์เซอร์สามารถนำทางได้ทุกที่
คำถามของฉันคือ - และนี่คือจิ๊กซอว์จาวาสคริปต์มากกว่าปัญหาที่เกิดขึ้นจริง- คุณจะเอาชนะบัสเตอร์ที่มีเฟรมได้อย่างไร
ฉันมีความคิดเล็กน้อย แต่ไม่มีอะไรทำงานในการทดสอบของฉัน:
- การพยายามล้าง
onbeforeunload
กิจกรรมผ่านonbeforeunload = null
ไม่มีผล - การเพิ่ม
alert()
กระบวนการหยุดให้ผู้ใช้ทราบว่ามันเกิดขึ้น แต่ไม่ได้ยุ่งเกี่ยวกับรหัสในทางใดทางหนึ่ง คลิกตกลงช่วยให้การหยุดดำเนินการต่อเป็นปกติ - ฉันไม่สามารถคิดถึงวิธีล้าง
setInterval()
ตัวจับเวลาได้
ฉันไม่ได้เป็นนักเขียนโปรแกรม JavaScript มากนักดังนั้นนี่คือความท้าทายของฉันสำหรับคุณ: เฮ้บัสเตอร์คุณช่วยปราบบัสเตอร์เฟรมที่น่าจับตามองได้ไหม?
example.org
ที่ระบุไว้ใน RFC 2606 ietf.org/rfc/rfc2606.txt