เฟรมบัสเตอร์บัสเตอร์ ... จำเป็นต้องใช้รหัสบัสเตอร์


422

สมมติว่าคุณไม่ต้องการให้เว็บไซต์อื่น ๆ "ใส่เฟรม" ไซต์ของคุณใน<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 มากนักดังนั้นนี่คือความท้าทายของฉันสำหรับคุณ: เฮ้บัสเตอร์คุณช่วยปราบบัสเตอร์เฟรมที่น่าจับตามองได้ไหม?


6
ฉันไม่แน่ใจว่า frame-buster-buster ใช้งานได้จริง ... เมื่อฉันพยายามทดสอบ (เปลี่ยนเส้นทางไปยังตัวจัดการที่ฉันตั้งค่าเพื่อส่งคืน 204) มันป้องกันฉันจากการนำทางที่ใดก็ได้นอกหน้ารวมถึงการพิมพ์สิ่งต่างๆ ในแถบที่อยู่! ฉันต้องปิดแท็บเบราว์เซอร์และเปิดใหม่เพื่อไปที่ใดก็ได้ ดังนั้นในคำอื่น ๆ ฉันไม่แน่ใจว่าสิ่งนี้ต้องการวิธีแก้ปัญหาเพราะมือปราบเฟรมมือปราบที่ต้องการถูกจับคือ ... ถูกจับเริ่มต้นด้วย :) (ทั้งที่หรือฉันเมาขึ้นทดสอบของฉันซึ่งไม่เคยเกิดขึ้น ... );)
แมตต์ Winckler

16
แมตต์โค้ดเฟรมบัสเตอร์บัสเตอร์โพสต์ด้านบนใช้งานได้อย่างแน่นอน A .. เอ่อ .. เพื่อน .. ของฉัน .. บอกฉัน .. เกี่ยวกับเรื่องนี้ หรือบางสิ่งบางอย่าง. :)
Jeff Atwood

10
Jeff คุณกำลังทดสอบกับ windows ทั้งสองในโดเมนเดียวกันหรือไม่ ดูเหมือนว่าคุณเพราะถ้าคุณไม่ได้แล้วข้อ จำกัด การรักษาความปลอดภัยจะป้องกันคุณจากการปรับเปลี่ยน 'onbeforeunload'
เจมส์

29
ในหมายเหตุด้านข้าง: เมื่อโพสต์ตัวอย่างโปรดใช้โดเมนเช่นexample.orgที่ระบุไว้ใน RFC 2606 ietf.org/rfc/rfc2606.txt
Christoph

3
เกี่ยวกับชุดรูปแบบทั่วไปของการตอบโต้การตอบโต้: galactanet.com/comic/view.php?strip=209
Joey

คำตอบ:


149

ฉันไม่แน่ใจว่าสิ่งนี้เป็นไปได้หรือไม่ - แต่ถ้าคุณไม่สามารถแยกเฟรมได้ทำไมไม่แสดงแค่คำเตือน ตัวอย่างเช่นหากหน้าของคุณไม่ใช่ "หน้าแรก" ให้สร้างวิธี setInterval ที่พยายามทำลายเฟรม หากหลังจาก 3 หรือ 4 พยายามที่หน้าของคุณยังไม่ได้เป็นหน้าบน - สร้างองค์ประกอบ div ที่ครอบคลุมทั้งหน้า (กล่อง modal) ด้วยข้อความและลิงค์เช่น ...

คุณกำลังดูหน้านี้ในหน้าต่างเฟรมที่ไม่ได้รับอนุญาต - (Blah blah ... ปัญหาความปลอดภัยที่อาจเกิดขึ้น)

คลิกที่ลิงค์นี้เพื่อแก้ไขปัญหานี้

ไม่ใช่สิ่งที่ดีที่สุด แต่ฉันไม่เห็นว่าพวกเขาจะเขียนบทของพวกเขาได้อย่างไร


2
ฉันลองและใช้งานได้แล้ว อีกหนึ่งชิ้นที่ฉันชอบเกี่ยวกับโซลูชันนี้คือการนำเสนอไซต์ที่เขา / เธอใช้ก่อนที่จะเข้าสู่เนื้อหาของคุณ โค้ดตัวอย่าง: if (parent.frames.length> 0) {top.location.replace (document.location); setTimeout (ฟังก์ชั่น () {ถ้า (parent.frames.length> 0) {document.location = " google.com ";}}, 10); }
สมเด็จพระสันตะปาปา

ไม่เพียง แต่เป็นวิธีที่ดีในการหลีกเลี่ยงการล่วงละเมิด แต่เป็นมิตรกับเว็บไซต์ที่อาจต้องการ iframe เว็บไซต์ของคุณเพียงแค่มองที่มันแม้ว่าจะไม่อนุญาตให้ใช้งาน เป็นการดีที่ฉันคิดว่าควรใช้ภาพหน้าจอของหน้าแรกของเว็บไซต์พร้อมคำอธิบายว่าทำไมไม่สามารถใช้ใน iframe ที่วางซ้อนอยู่ด้านบน
wheresrhys

33
นี่คือสิ่งที่ Facebook ทำ
shamittomar

2
แต่นี่อาจเป็นประโยชน์ถ้าไซต์ที่ถูกจับตามองจะสร้าง anti anti anti anti เท็จ ... (ไม่ว่าเราจะต่อต้านมากแค่ไหน) lighbox div สำหรับตัวเองนำเสนอลิงค์ฟิชชิ่งหรืออะไรก็ตาม ... tbc
yunzen

7
ความคิดอื่นจะเพียงแค่ล้างหน้าอย่างสมบูรณ์ด้วยสิ่งที่ชอบdocument.write("");(หลังจากที่คุณได้
พิสูจน์

211

6
ยอดเยี่ยมสนับสนุนในเบราว์เซอร์. exe เป็นวิธีที่จะไปโดยไม่ต้องสงสัย เมื่อคุณพูดว่า "เบราว์เซอร์ส่วนใหญ่" เบราว์เซอร์ใดที่เฉพาะเจาะจง ฉันไม่พบแหล่งที่ดีสำหรับสิ่งใดนอกจาก IE8
Jeff Atwood

2
นี่คือหน้าทดสอบ: enhanceie.com/test/clickjack Chrome 4.1.249.1042 รองรับ รองรับ Opera 10.50 Firefox 3.6.2 ยังไม่รองรับ รองรับ Safari 4.0.3
EricLaw

1
Firefox 3.6.9 จะรองรับอย่างเป็นทางการ ( hackademix.net/2010/08/31/ … ) และ Firefox ที่ติดตั้งด้วย NoScript นั้นมีมาตั้งแต่ต้นปี 2009 ( hackademix.net/2009/01/29/x/frame-) options-in-firefox )
ssokolow

4
เป็นการดีที่สุดที่จะรวมสิ่งนี้กับ javascript framebuster
Jesse Weigert

1
หรือรวมกับคำตอบธันวาคม 12 ในหน้านี้: stackoverflow.com/a/13708510/328397
goodguys_activate

34

เราได้ใช้แนวทางต่อไปนี้ในเว็บไซต์ของเราจากhttp://seclab.stanford.edu/websec/framebusting/framebust.pdf

<style>
 body { 
 display : none   
}
</style>
<script>
if(self == top) {
document.getElementsByTagName("body")[0].style.display = 'block';
}
else{
top.location = self.location;
}
</script>

3
บิงโก! ไม่แน่ใจว่าทำไมการอัปเดตนี้ไม่ได้เพิ่มขึ้นเพราะเป็นคำตอบที่ดีที่สุด (ถัดจากคำตอบของ X-Frame-Options แต่เป็นการรวมที่ดีที่สุด)
Jesse Weigert

1
ควรเลือกคำตอบหรือของฉันนี้ :)

ฉันชอบความคิดของคุณในการใช้ทั้งนี้และ X-Frame-Options: ปฏิเสธคำตอบ
Max West

สิ่งนี้ต้องใช้ JS ซึ่งเป็นภาระที่ใหญ่มากสำหรับ IMHO
Navin

1
+1 - นี่คือคำตอบที่ดีที่สุดเมื่อไม่สามารถใช้ X-FRAME-OPTIONS (ตัวอย่างเช่นเมื่อคุณต้องการอนุญาตหรือปฏิเสธตามเงื่อนไขขึ้นอยู่กับผู้อ้างอิง)
Jay Sullivan

29

มากับสิ่งนี้และดูเหมือนว่าจะทำงานอย่างน้อยใน Firefox และเบราว์เซอร์ Opera

if(top != self) {
 top.onbeforeunload = function() {};
 top.location.replace(self.location.href);
}

2
โซลูชันของ Jani และ Jeff (แก้ไขครั้งเดียว) นั้นถูกต้องและทำงานได้อย่างเท่าเทียมกัน ให้เจนี่ยอมรับเพราะการแก้ปัญหาของเขาทำงานที่เหมาะสมโดยไม่ต้องแก้ไขใด ๆ
เจฟฟ์แอด

29
สิ่งนี้จะใช้งานได้หากหน้าต่างทั้งสองเป็นโดเมนเดียวกัน เหตุการณ์ที่เกิดขึ้นได้ยากเมื่อคุณต้องการหนีออกจากเฟรม
James

หากมีเฟรมซ้อนอยู่คุณจะต้องเดินโซ่และเอาonbeforeunloadตัวจัดการทั้งหมดออกไม่ใช่เฉพาะเฟรมด้านบน!
Christoph

12
การชี้แจงที่สำคัญ: สิ่งนี้ได้ผลสำหรับฉันเพราะ iframe src = ได้รับการตั้งค่าแบบไดนามิกและทำให้นโยบายข้ามโดเมนไม่ได้มีผลบังคับใช้ JP นั้นถูกต้องอย่างแน่นอนในค่าคงที่ src = สิ่งนี้จะไม่ทำงาน
Jeff Atwood

5
ตกลงตอนนี้บางคนสามารถเกิดขึ้นกับมือปราบบัสเตอร์เฟรมมือปราบบัสเตอร์?
Epaga

23

เมื่อพิจารณาถึงมาตรฐาน HTML5 ปัจจุบันที่แนะนำ sandbox สำหรับ iframe รหัสการป้องกันเฟรมที่ให้ไว้ในหน้านี้สามารถปิดการใช้งานได้เมื่อผู้โจมตีใช้ sandbox เพราะจะ จำกัด iframe จากการทำตาม:

allow-forms: Allow form submissions.
allow-popups: Allow opening popup windows.
allow-pointer-lock: Allow access to pointer movement and pointer lock.
allow-same-origin: Allow access to DOM objects when the iframe loaded form same origin
allow-scripts: Allow executing scripts inside iframe
allow-top-navigation: Allow navigation to top level window

โปรดดู: http://www.whatwg.org/specs/web-apps/current-work/multipage/the-iframe-element.html#attr-iframe-sandbox

ตอนนี้ผู้โจมตีพิจารณาใช้รหัสต่อไปนี้เพื่อโฮสต์เว็บไซต์ของคุณใน iframe:

<iframe src="URI" sandbox></iframe>

จากนั้นโค้ดการบล็อคเฟรม JavaScript ทั้งหมดจะล้มเหลว

หลังจากตรวจสอบรหัส busing เฟรมทั้งหมดเฉพาะการป้องกันนี้ใช้ได้ในทุกกรณี:

<style id="antiClickjack">body{display:none !important;}</style>
<script type="text/javascript">
   if (self === top) {
       var antiClickjack = document.getElementById("antiClickjack");
       antiClickjack.parentNode.removeChild(antiClickjack);
   } else {
       top.location = self.location;
   }
</script>

ที่เสนอโดยGustav Rydstedt, Elie Bursztein, Dan Boneh และ Collin Jackson (2010)


19

หลังจากครุ่นคิดเรื่องนี้ซักพักฉันเชื่อว่านี่จะแสดงให้พวกเขาเห็นว่าใครเป็นเจ้านาย ...

if(top != self) {
  window.open(location.href, '_top');
}

การใช้_topเป็นพารามิเตอร์เป้าหมายสำหรับwindow.open()จะเปิดในหน้าต่างเดียวกัน


6
if (top != self) {
  top.location.replace(location);
  location.replace("about:blank"); // want me framed? no way!
}

6

ฉันจะกล้าและโยนหมวกของฉันไปที่แหวนบนอันนี้ (เก่าแก่เหมือนเดิม) ดูว่ามีกี่ downvotes ที่ฉันสามารถรวบรวมได้

นี่คือความพยายามของฉันซึ่งดูเหมือนว่าจะทำงานได้ทุกที่ที่ฉันทดสอบ (Chrome20, IE8 และ FF14):

(function() {
    if (top == self) {
        return;
    }

    setInterval(function() {
        top.location.replace(document.location);
        setTimeout(function() {
            var xhr = new XMLHttpRequest();
            xhr.open(
                'get',
                'http://mysite.tld/page-that-takes-a-while-to-load',
                false
            );
            xhr.send(null);
        }, 0);
    }, 1);
}());

ฉันวางโค้ดนี้ใน<head>และเรียกมันว่าจากท้าย<body>เพื่อให้แน่ใจว่าหน้าของฉันจะแสดงผลก่อนที่จะเริ่มโต้เถียงกับรหัสที่เป็นอันตรายไม่ทราบว่านี่เป็นวิธีที่ดีที่สุดหรือไม่ YMMV

มันทำงานยังไง?

... ฉันได้ยินคุณถาม - คำตอบที่ดีคือฉันไม่รู้จริงๆ มันเป็นเรื่องเหลวไหลมากที่จะทำให้มันใช้ได้ทุกที่ที่ฉันทำการทดสอบ

นี่คือความคิดเบื้องหลัง:

  • ตั้งฟังก์ชั่นให้ทำงานในช่วงเวลาที่ต่ำที่สุด แนวคิดพื้นฐานที่อยู่เบื้องหลังการแก้ปัญหาที่เป็นจริงใด ๆ ที่ฉันได้เห็นคือการเติมกำหนดการกับเหตุการณ์มากกว่าที่มือปราบเฟรมมี
  • ทุกครั้งที่ฟังก์ชั่นเริ่มทำงานให้ลองเปลี่ยนตำแหน่งของเฟรมด้านบน ข้อกำหนดที่ชัดเจนพอสมควร
  • นอกจากนี้ยังกำหนดฟังก์ชั่นให้เรียกใช้ทันทีซึ่งจะใช้เวลานานในการทำให้เสร็จสมบูรณ์ (ดังนั้นการปิดกั้นบัสเตอร์บัสเตอร์เฟรมจากการรบกวนการเปลี่ยนตำแหน่ง) ฉันเลือก XMLHttpRequest แบบซิงโครนัสเพราะเป็นกลไกเดียวที่ฉันสามารถนึกได้ว่าไม่จำเป็นต้องมีการโต้ตอบกับผู้ใช้ (หรืออย่างน้อยขอ) การโต้ตอบและไม่เคี้ยวเวลา CPU ของผู้ใช้

สำหรับฉันhttp://mysite.tld/page-that-takes-a-while-to-load(เป้าหมายของ XHR) ฉันใช้สคริปต์ PHP ที่มีลักษณะดังนี้:

<?php sleep(5);

เกิดอะไรขึ้น?

  • Chrome และ Firefox รอ 5 วินาทีในขณะที่ XHR เสร็จสมบูรณ์จากนั้นเปลี่ยนเส้นทางไปยัง URL ของหน้าเฟรม
  • IE เปลี่ยนเส้นทางสวยมากทันที

คุณไม่สามารถหลีกเลี่ยงเวลารอใน Chrome และ Firefox ได้หรือไม่

ชัดเจนว่าไม่. ตอนแรกฉันชี้ XHR ไปยัง URL ที่จะคืนค่า 404 - สิ่งนี้ไม่ทำงานใน Firefox จากนั้นฉันลองsleep(5);วิธีที่ในที่สุดฉันก็ลงจอดเพื่อหาคำตอบนี้จากนั้นฉันก็เริ่มเล่นกับความยาวของการนอนหลับในรูปแบบต่างๆ ฉันไม่พบรูปแบบพฤติกรรมที่แท้จริง แต่ฉันพบว่าถ้ามันสั้นเกินไป Firefox โดยเฉพาะจะไม่เล่นบอล (Chrome และ IE ดูเหมือนจะประพฤติตัวค่อนข้างดี) ฉันไม่ทราบว่าคำจำกัดความของ "สั้นเกินไป" นั้นเป็นของจริง แต่ 5 วินาทีดูเหมือนจะใช้ได้ทุกครั้ง


หากนินจา Javascript ที่ผ่านการใด ๆ ต้องการอธิบายให้ดีขึ้นว่าเกิดอะไรขึ้นเหตุใดจึงเป็นสิ่งที่ผิดพลาดและไม่น่าเชื่อถือรหัสที่แย่ที่สุดที่พวกเขาเคยเห็นและอื่น ๆ ฉันจะฟังอย่างมีความสุข


ดูเหมือนว่าคุณสามารถลบประโยคที่น่ากังวลทั้งหมดของคุณออกได้
mplungjan

6

ตั้งแต่ปี 2015 คุณควรใช้frame-ancestorsคำสั่งของ CSP2 สำหรับสิ่งนี้ สิ่งนี้ถูกนำไปใช้ผ่านส่วนหัวการตอบกลับ HTTP

เช่น

Content-Security-Policy: frame-ancestors 'none'

แน่นอนว่ามีเบราว์เซอร์ไม่มากที่สนับสนุน CSP2 ดังนั้นจึงควรรวมX-Frame-Optionsส่วนหัวเก่าไว้ด้วย:

X-Frame-Options: DENY

ฉันขอแนะนำให้รวมทั้งสองอย่างมิฉะนั้นไซต์ของคุณจะยังคงเสี่ยงต่อการถูกโจมตีของClickjackingในเบราว์เซอร์รุ่นเก่าและแน่นอนว่าคุณจะได้รับเฟรมที่ไม่พึงประสงค์แม้ว่าจะไม่มีเจตนาร้ายก็ตาม เบราว์เซอร์ส่วนใหญ่ทำการอัปเดตโดยอัตโนมัติในวันนี้อย่างไรก็ตามคุณยังคงมีแนวโน้มที่จะทำให้ผู้ใช้องค์กรติดอยู่ใน Internet Explorer รุ่นเก่าด้วยเหตุผลความเข้ากันได้ของแอปพลิเคชันรุ่นเก่า


1
เบราว์เซอร์หลักทั้งหมดรองรับ CSP นี่คือคำตอบที่ถูกต้องในปี 2019 และในอนาคตอันใกล้
สตีเฟ่น R

5

ตกลงดังนั้นเราจึงรู้ว่าอยู่ในกรอบ ดังนั้นเรา location.href ไปยังหน้าพิเศษอีกอันที่มีพา ธ เป็นตัวแปร GET ตอนนี้เราอธิบายให้ผู้ใช้ทราบถึงสิ่งที่เกิดขึ้นและให้ลิงก์กับตัวเลือก target = "_ TOP" ง่ายและอาจใช้งานได้ (ยังไม่ได้ทดสอบ) แต่ต้องมีการโต้ตอบกับผู้ใช้ บางทีคุณอาจชี้ให้เห็นถึงเว็บไซต์ที่ละเมิดต่อผู้ใช้และสร้างความอับอายให้กับผู้คลิกเพื่อไปยังเว็บไซต์ของคุณที่ไหนสักแห่ง .. แค่ไอเดีย แต่มันก็ใช้ได้คืน


5

โซลูชันที่เสนอทั้งหมดบังคับให้มีการเปลี่ยนแปลงในตำแหน่งของหน้าต่างด้านบนโดยตรง ถ้าผู้ใช้ต้องการให้เฟรมอยู่ตรงนั้น ตัวอย่างเช่นกรอบด้านบนในผลลัพธ์รูปภาพของเครื่องมือค้นหา

ฉันเขียนต้นแบบโดยค่าเริ่มต้นอินพุตทั้งหมด (ลิงก์แบบฟอร์มและองค์ประกอบอินพุต) ถูกปิดใช้งานและ / หรือไม่ทำอะไรเลยเมื่อเปิดใช้งาน

หากตรวจพบเฟรมที่มีอยู่อินพุตจะถูกปิดการใช้งานและจะมีข้อความเตือนปรากฏขึ้นที่ด้านบนของหน้า ข้อความเตือนประกอบด้วยลิงค์ที่จะเปิดเวอร์ชันที่ปลอดภัยของเพจในหน้าต่างใหม่ วิธีนี้จะช่วยป้องกันไม่ให้มีการใช้หน้าเว็บสำหรับ Clickjacking ในขณะที่ยังคงให้ผู้ใช้สามารถดูเนื้อหาในสถานการณ์อื่น ๆ

หากตรวจไม่พบเฟรมที่มีอยู่อินพุตจะถูกเปิดใช้งาน

นี่คือรหัส คุณต้องตั้งค่าแอตทริบิวต์ HTML มาตรฐานให้เป็นค่าที่ปลอดภัยและเพิ่มแอตทริบิวต์ของ additonal ที่มีค่าจริง มันอาจจะไม่สมบูรณ์และเพื่อความปลอดภัยอย่างเต็มรูปแบบคุณสมบัติเพิ่มเติม (ฉันกำลังคิดเกี่ยวกับการจัดการเหตุการณ์) อาจจะต้องได้รับการปฏิบัติในลักษณะเดียวกัน:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
  <head>
    <title></title>
    <script><!--
      function replaceAttributeValuesWithActualOnes( array, attributeName, actualValueAttributeName, additionalProcessor ) {
        for ( var elementIndex = 0; elementIndex < array.length; elementIndex += 1 ) {
          var element = array[ elementIndex ];
          var actualValue = element.getAttribute( actualValueAttributeName );
          if ( actualValue != null ) {
            element[ attributeName ] = actualValue;
          }

          if ( additionalProcessor != null ) {
            additionalProcessor( element );
          }
        }
      }

      function detectFraming() {
        if ( top != self ) {
          document.getElementById( "framingWarning" ).style.display = "block";
        } else {
          replaceAttributeValuesWithActualOnes( document.links, "href", "acme:href" );

          replaceAttributeValuesWithActualOnes( document.forms, "action", "acme:action", function ( form ) {
            replaceAttributeValuesWithActualOnes( form.elements, "disabled", "acme:disabled" );
          });
        }
      }
      // -->
    </script>
  </head>
  <body onload="detectFraming()">
    <div id="framingWarning" style="display: none; border-style: solid; border-width: 4px; border-color: #F00; padding: 6px; background-color: #FFF; color: #F00;">
      <div>
        <b>SECURITY WARNING</b>: Acme App is displayed inside another page.
        To make sure your data is safe this page has been disabled.<br>
        <a href="framing-detection.html" target="_blank" style="color: #090">Continue working safely in a new tab/window</a>
      </div>
    </div>
    <p>
      Content. <a href="#" acme:href="javascript:window.alert( 'Action performed' );">Do something</a>
    </p>
    <form name="acmeForm" action="#" acme:action="real-action.html">
      <p>Name: <input type="text" name="name" value="" disabled="disabled" acme:disabled=""></p>
      <p><input type="submit" name="save" value="Save" disabled="disabled" acme:disabled=""></p>
    </form>
  </body>
</html>

ปัญหานี้คือผู้สร้างเฟรมสามารถใช้ตำแหน่ง: แน่นอนที่จะวางปุ่มที่ใช้งานด้านบนของปุ่มที่ไม่ใช้งานของคุณและผู้ใช้จะเห็นหน้าเว็บของคุณและคิดว่าพวกเขากำลังคลิกปุ่มของคุณ
jmucchiello

ข้อความเตือนจะยังคงแสดงอยู่ แต่แน่นอนว่ามันเป็นเรื่องง่ายที่จะครอบคลุมลิงก์ไปยังหน้าที่ปลอดภัยตามที่คุณแนะนำ แต่ทำไมต้องผ่านปัญหาทั้งหมดในการกำหนดกรอบหน้าของฉันเพื่อให้ผู้คนคลิกที่ปุ่มที่คุ้นเคยหากคุณสามารถคัดลอกหน้าและบรรลุผลแบบเดียวกันได้ รหัสด้านบนส่วนใหญ่ป้องกันการคลิกแจ็ค หากคุณแสดงหน้าของฉันอย่างชัดเจนเหนือหน้าอื่นมันเป็นไปไม่ได้ที่จะเรียกการกระทำบนเว็บไซต์ของฉัน
Johan Stuyts

หากสิ่งนี้อยู่ในกรอบโซนที่ถูก จำกัด IE8 หรือเฟรม Chrome sandbox จาวาสคริปต์จะไม่ทำงาน ฉันสงสัยว่าการแก้ไขใดที่จำเป็นสำหรับกรณีเหล่านี้
goodguys_activate

4

ทีนี้คุณสามารถปรับเปลี่ยนค่าของตัวนับได้ แต่นั่นเป็นวิธีที่เปราะ คุณสามารถโหลดเนื้อหาของคุณผ่าน AJAX ได้หลังจากที่คุณระบุว่าไซต์นั้นไม่ได้อยู่ในเฟรม - ยังไม่ใช่โซลูชันที่ยอดเยี่ยม แต่หวังว่าจะช่วยหลีกเลี่ยงการถ่ายทำในเหตุการณ์ก่อนที่จะโหลด (ฉันสมมติว่า)

แก้ไข: แนวคิดอื่น หากคุณตรวจพบว่าคุณอยู่ในเฟรมขอให้ผู้ใช้ปิดการใช้งานจาวาสคริปต์ก่อนที่จะคลิกลิงค์ที่จะพาคุณไปยัง URL ที่ต้องการ (ผ่านการสอบถามที่ช่วยให้หน้าเว็บของคุณบอกผู้ใช้ว่าสามารถเปิดใช้งานจาวาสคริปต์ได้อีกครั้ง มี)

แก้ไข 2: Go nuclear - หากคุณตรวจพบว่าคุณอยู่ในเฟรมให้ลบเนื้อหาเนื้อหาของเอกสารและพิมพ์ข้อความที่น่ารังเกียจ

แก้ไข 3: คุณสามารถระบุเอกสารด้านบนและตั้งค่าฟังก์ชั่นทั้งหมดให้เป็นโมฆะ (แม้จะเป็นแบบไม่ระบุชื่อ) ได้หรือไม่?


โปรแกรม Outlook (เดิม Hotmail) 'ไปนิวเคลียร์' ถ้ามันไม่สามารถได้รับออกมาจากกรอบ - มันทำให้เนื้อหาทั้งหมดของ<body>ภายในชุดแท็ก<plaintext> display: noneมันค่อนข้างมีประสิทธิภาพ
uınbɐɥs

4

หากคุณเพิ่มการแจ้งเตือนทันทีหลังจากรหัสบัสเตอร์การแจ้งเตือนจะหยุดการทำงานของเธรด javascript และจะทำให้การโหลดหน้าเว็บ นี่คือสิ่งที่ StackOverflow ทำและหลุดออกจาก iframe ของฉันแม้ว่าฉันจะใช้บัสเตอร์ที่จับเฟรม นอกจากนี้ยังทำงานกับหน้าทดสอบอย่างง่ายของฉัน สิ่งนี้ได้รับการทดสอบใน Firefox 3.5 และ IE7 บน windows เท่านั้น

รหัส:

<script type="text/javascript">
if (top != self){
  top.location.replace(self.location.href);
  alert("for security reasons bla bla bla");
}
</script>

3

ฉันคิดว่าคุณเกือบจะอยู่ที่นั่น คุณเคยลองไหม:

window.parent.onbeforeunload = null;
window.parent.location.replace(self.location.href);

หรืออีกทางหนึ่ง:

window.parent.prevent_bust = 0;

หมายเหตุ: ฉันไม่ได้ทดสอบสิ่งนี้


1
ฉันแก้ไขตัวอย่างรหัสของคุณ (การทดสอบสำหรับผู้ปกครองดูเหมือนจะล้มเหลว) แต่รุ่นที่แก้ไขแล้วดูเหมือนว่าจะใช้งานได้!
เจฟฟ์แอด

1
เย็น. มันเป็นการยากที่จะตอบด้วยรหัสที่ยังไม่ผ่านการทดสอบ - ฉันทำอย่างน้อยก็เพื่อให้ได้ความคิดที่ทั่วถึงและปล่อยให้ debug ของผู้ถามที่ไม่ดี :)
Jeff Meatball Yang

12
จะไม่ทำงานหากผู้ปกครองอยู่ในโดเมนอื่นซึ่งอาจเป็นกรณี!
Josh Stodola

2

แล้วการเรียกบัสเตอร์ด้วยซ้ำล่ะ? สิ่งนี้จะสร้างสภาพการแข่งขัน แต่ใคร ๆ ก็หวังว่ามือปราบจะออกมาด้านบน:

(function() {
    if(top !== self) {
        top.location.href = self.location.href;
        setTimeout(arguments.callee, 0);
    }
})();

2

หากคุณดูค่าที่ส่งคืนโดยsetInterval()พวกเขามักจะเป็นเลขหลักเดียวดังนั้นคุณจึงสามารถปิดการใช้งานอินเตอร์รัปต์ทั้งหมดด้วยรหัสบรรทัดเดียว:

for (var j = 0 ; j < 256 ; ++j) clearInterval(j)

2

ฉันอาจเพิ่งจะมีวิธีที่จะทำลายจาวาสคริปต์มือปราบบัสเตอร์เฟรม ใช้ getElementsByName ในฟังก์ชั่นจาวาสคริปต์ของฉันฉันได้ตั้งวงวนระหว่างเฟรมบัสเตอร์กับสคริปต์บัสเตอร์เฟรมเฟรมจริง ตรวจสอบโพสต์นี้ออก http://www.phcityonweb.com/frame-buster-buster-buster-2426


0

setInterval และ setTimeout สร้างช่วงเวลาที่เพิ่มขึ้นโดยอัตโนมัติ แต่ละครั้งที่ setTimeout หรือ setInterval ถูกเรียกหมายเลขนี้จะเพิ่มขึ้นหนึ่งครั้งดังนั้นถ้าคุณเรียกใช้ setTimeout คุณจะได้รับค่าสูงสุดและเป็นปัจจุบัน

   var currentInterval = 10000;
   currentInterval += setTimeout( gotoHREF, 100 );
   for( var i = 0; i < currentInterval; i++ ) top.clearInterval( i );
   // Include setTimeout to avoid recursive functions.
   for( i = 0; i < currentInterval; i++ )     top.clearTimeout( i );

   function gotoHREF(){
           top.location.href = "http://your.url.here";
   }

เนื่องจากแทบจะไม่เคยได้ยินมาก่อนว่าจะมี 10,000 ชุดพร้อมกันตั้งค่าช่วงเวลาและ setTimeouts ทำงานและเนื่องจาก setTimeout ส่งกลับ "ช่วงเวลาสุดท้ายหรือหมดเวลาสร้าง + 1" และเนื่องจาก top.clearInterval ยังคงสามารถเข้าถึงได้สิ่งนี้จะเอาชนะการโจมตีหมวกดำ เว็บไซต์ที่อธิบายไว้ข้างต้น


0

ใช้ htaccess เพื่อหลีกเลี่ยงเฟรมที่มีช่องเสียบสูง iframe และเนื้อหาใด ๆ เช่นรูปภาพ

RewriteEngine on
RewriteCond %{HTTP_REFERER} !^http://www\.yoursite\.com/ [NC]
RewriteCond %{HTTP_REFERER} !^$
RewriteRule ^(.*)$ /copyrights.html [L]

นี่จะแสดงหน้าลิขสิทธิ์แทนการคาดหวัง


สิ่งนี้ขึ้นอยู่กับผู้อ้างอิงซึ่งเป็น) ไม่ได้ตั้งค่าเสมอ (เนื่องจากการตั้งค่าเบราว์เซอร์หรือส่วนขยายหรือเพียงเพราะหน้าการอ้างอิงใช้ HTTPS โดยไม่ใช้<meta name="referrer" …/>และ b) ตั้งค่าเมื่อคลิกที่ลิงก์ดังนั้นคุณจึงไม่อนุญาตลิงก์ไปยังหน้าเว็บ เว็บ
Martin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.