Khung Buster Buster mã Buster cần thiết


422

Giả sử bạn không muốn các trang web khác "đóng khung" trang web của mình trong <iframe>:

<iframe src="http://example.org"></iframe>

Vì vậy, bạn chèn JavaScript chống khung, đóng khung JavaScript vào tất cả các trang của bạn:

/* break us out of any containing iframes */
if (top != self) { top.location.replace(self.location.href); }

Thông minh! Bây giờ bạn tự động "bán thân" hoặc thoát ra khỏi bất kỳ iframe nào. Ngoại trừ một vấn đề nhỏ.

Khi nó bật ra, mã phá vỡ khung của bạn có thể bị phá vỡ , như được hiển thị ở đây :

<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>

Mã này thực hiện như sau:

  • tăng bộ đếm mỗi khi trình duyệt cố gắng điều hướng khỏi trang hiện tại, thông qua window.onbeforeunloadtrình xử lý sự kiện
  • thiết lập bộ hẹn giờ kích hoạt mỗi mili giây thông qua setInterval()và nếu nó thấy bộ đếm tăng lên, hãy thay đổi vị trí hiện tại thành máy chủ điều khiển của kẻ tấn công
  • máy chủ đó phục vụ một trang có mã trạng thái HTTP 204 , điều này không khiến trình duyệt điều hướng ở bất cứ đâu

Câu hỏi của tôi là - và đây là một câu đố JavaScript hơn là một vấn đề thực tế - làm thế nào bạn có thể đánh bại buster phá khung?

Tôi đã có một vài suy nghĩ, nhưng không có gì làm việc trong thử nghiệm của tôi:

  • cố gắng để xóa onbeforeunloadsự kiện thông qua onbeforeunload = nullkhông có hiệu lực
  • việc thêm một alert()quá trình đã dừng cho phép người dùng biết nó đang xảy ra, nhưng không can thiệp vào mã theo bất kỳ cách nào; nhấp vào OK cho phép tiếp tục nhộn nhịp như bình thường
  • Tôi không thể nghĩ ra cách nào để xóa setInterval()bộ đếm thời gian

Tôi không phải là một lập trình viên JavaScript, vì vậy đây là thách thức của tôi với bạn: hey buster, bạn có thể phá vỡ buster nhộn nhịp khung hình không?


6
Tôi không chắc chắn buster-buster thực sự hoạt động ... khi tôi thử kiểm tra nó (chuyển hướng đến một trình xử lý mà tôi đã thiết lập để trả về 204), nó ngăn tôi điều hướng bất cứ nơi nào bên ngoài trang - bao gồm cả việc gõ nội dung trong thanh địa chỉ! Tôi phải đóng tab trình duyệt và mở một cái mới để đến bất cứ nơi nào. Vì vậy, nói cách khác, tôi không chắc chắn điều này cần một giải pháp, bởi vì buster-buster muốn được bẻ khóa là ... bắt đầu với. :) (Hoặc là hoặc tôi đã làm hỏng bài kiểm tra của mình, điều đó không bao giờ có thể xảy ra ...);)
Matt Winckler

16
Matt, mã khung buster-buster được đăng ở trên chắc chắn hoạt động. A .. uh .. bạn .. của tôi .. nói với tôi .. về nó. Hoặc một cái gì đó. :)
Jeff Atwood

10
Jeff, bạn đang thử nghiệm với cả hai cửa sổ trên cùng một tên miền phải không? Có vẻ như bạn là vì nếu bạn không thì các hạn chế bảo mật sẽ ngăn bạn sửa đổi 'onB BeforeUnload'
James

29
Lưu ý phụ: Khi đăng các ví dụ, vui lòng sử dụng các tên miền như example.orgđược chỉ định trong RFC 2606 ietf.org/rfc/rfc2606.txt
Christoph

3
Về chủ đề chung của các biện pháp đối phó truy cập: galactanet.com/comic/view.php?strip=209
Joey

Câu trả lời:


149

Tôi không chắc điều này có khả thi hay không - nhưng nếu bạn không thể phá vỡ khung hình, tại sao không chỉ hiển thị cảnh báo. Ví dụ: Nếu trang của bạn không phải là "trang trên cùng", hãy tạo phương thức setInterval cố phá vỡ khung. Nếu sau 3 hoặc 4 lần thử, trang của bạn vẫn không phải là trang trên cùng - hãy tạo một phần tử div bao trùm toàn bộ trang (hộp phương thức) bằng một thông báo và liên kết như ...

Bạn đang xem trang này trong một cửa sổ khung trái phép - (Blah blah ... vấn đề bảo mật tiềm ẩn)

nhấp vào liên kết này để khắc phục vấn đề này

Không phải là tốt nhất, nhưng tôi không thấy bất kỳ cách nào họ có thể viết kịch bản theo cách đó.


2
Tôi đã thử cái này và cái này hoạt động. Một phần khác mà tôi thích về giải pháp này là nó đưa ra ánh sáng cho người dùng loại trang web mà anh ấy / cô ấy đã truy cập trước khi đi đến nội dung của bạn. Mã mẫu: if (Parent.frames.length> 0) {top.location.replace (document.location); setTimeout (function () {if (Parent.frames.length> 0) {document.location = " google.com ";}}, 10); }
Giáo hoàng

Đây không chỉ là một cách tốt để tránh lạm dụng, nó còn khá thân thiện với các trang web có thể muốn iframe trang web của bạn chỉ để xem qua nó, mặc dù không cho phép sử dụng nó. Lý tưởng nhất, tôi nghĩ rằng nên sử dụng ảnh chụp màn hình trang chủ của trang web, với một số giải thích về lý do tại sao nó không thể được sử dụng trong iframe được phủ lên trên.
theo đó

33
Đây là cách Facebook làm điều đó.
shamittomar

2
nhưng có lẽ điều này có thể bị khai thác nếu lần lượt trang web nhộn nhịp này sẽ tạo ra một trình chống giả giả ... (dunno hiện tại chúng tôi đang chống lại bao nhiêu) lighbox div cho chính nó trình bày một liên kết lừa đảo hoặc bất cứ điều gì ... tbc
yunzen

7
Một ý tưởng khác là chỉ cần xóa sạch trang hoàn toàn bằng một cái gì đó như document.write("");(sau khi bạn đã xác định rằng nó đang được đóng khung
gabeio

211

6
tuyệt vời, hỗ trợ này trong trình duyệt .exe là cách để đi mà không nghi ngờ gì. Khi bạn nói "hầu hết các trình duyệt", cái nào cụ thể? Tôi không thể tìm thấy nguồn tốt cho bất cứ điều gì trừ IE8.
Jeff Atwood

2
Đây là một trang thử nghiệm: Enhie.com/test/clickjack . Hỗ trợ Chrome 4.1.249.1042. Opera hỗ trợ 10,50. Firefox 3.6.2 chưa hỗ trợ. Hỗ trợ Safari 4.0.3.
EricLaw

1
Firefox 3.6.9 sẽ hỗ trợ nó một cách tự nhiên ( hackademix.net / 2010/08/31 ) và mọi cài đặt Firefox với NoScript đã có từ đầu năm 2009 ( hackademix.net/2009/01/29/x-frame- tùy chọn trong firefox )
ssokolow

4
Tốt nhất là kết hợp điều này với bộ đệm khung javascript.
Jesse Weigert

1
Hoặc kết hợp câu trả lời này với câu trả lời 12 tháng 12 trên trang này: stackoverflow.com/a/13708510/328394
goodguys_activate

34

Chúng tôi đã sử dụng cách tiếp cận sau đây trong một trong các trang web của chúng tôi từ 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
Chơi lô tô! Không chắc chắn lý do tại sao điều này không được nâng cao hơn vì đây là câu trả lời hay nhất (bên cạnh câu trả lời Tùy chọn khung X, nhưng tốt nhất là kết hợp cả hai)
Jesse Weigert

1
Câu trả lời này hoặc của tôi nên được chọn :)

Tôi thích ý tưởng của bạn về việc sử dụng cả tùy chọn này và X-Frame-Options: từ chối trả lời.
Max West

Điều này đòi hỏi JS, đó là một gánh nặng khá lớn IMHO.
Navin

1
+1 - Đây là câu trả lời tốt nhất khi không thể sử dụng X-FRAME-TÙY CHỌN. (Ví dụ: khi bạn cần có điều kiện cho phép hoặc từ chối tùy thuộc vào người giới thiệu.)
Jay Sullivan

29

Đến với điều này, và nó dường như hoạt động ít nhất trong Firefox và trình duyệt Opera.

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

2
cả giải pháp của Jani và Jeff (một khi đã được chỉnh sửa) đều đúng và hoạt động tương đương; cho Jani chấp nhận vì giải pháp của anh ta hoạt động tốt mà không cần chỉnh sửa
Jeff Atwood

29
Điều này sẽ chỉ hoạt động nếu hai cửa sổ cùng tên miền; một sự cố hiếm khi xảy ra khi bạn muốn thoát khỏi một khung.
James

Nếu có các khung lồng nhau liên quan, bạn sẽ phải đi theo chuỗi khung và loại bỏ tất cả các onbeforeunloadtrình xử lý, không chỉ các khung trên đầu!
Christoph

12
làm rõ quan trọng: điều này hiệu quả với tôi vì iframe src = đang được đặt tự động và do đó chính sách tên miền chéo KHÔNG có hiệu lực. JP hoàn toàn đúng, trong một src tĩnh = điều này sẽ không hoạt động.
Jeff Atwood

5
ok bây giờ ai đó có thể đến với một buster buster buster buster?
Epaga

23

Xem xét tiêu chuẩn HTML5 hiện tại đã giới thiệu hộp cát cho iframe, tất cả các mã phá vỡ khung được cung cấp trong trang này có thể bị vô hiệu hóa khi kẻ tấn công sử dụng hộp cát vì nó hạn chế iframe sau:

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

Vui lòng xem: http://www.whatwg.org/specs/web-apps/civerse-work/multipage/the-iframe-element.html#attr-iframe-sandbox

Bây giờ, hãy xem xét kẻ tấn công đã sử dụng mã sau để lưu trữ trang web của bạn trong iframe:

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

Sau đó, tất cả mã phá vỡ khung JavaScript sẽ thất bại.

Sau khi kiểm tra tất cả mã busing khung, chỉ bảo vệ này hoạt động trong mọi trường hợp:

<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>

mà ban đầu được đề xuất bởi Gustav Rydstedt, Elie Bursztein, Dan Boneh và Collin Jackson (2010)


19

Sau khi suy nghĩ một lúc, tôi tin rằng điều này sẽ cho họ thấy ông chủ ...

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

Sử dụng _toplàm tham số đích cho window.open()sẽ khởi chạy nó trong cùng một cửa sổ.


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

6

Tôi sẽ trở nên dũng cảm và ném chiếc mũ của mình vào chiếc nhẫn này (cổ xưa như vậy), xem tôi có thể thu thập được bao nhiêu lượt tải xuống.

Đây là nỗ lực của tôi, dường như hoạt động ở mọi nơi tôi đã thử nghiệm (Chrome20, IE8 và 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);
}());

Tôi đã đặt mã này vào <head>và gọi nó từ cuối trang <body>để đảm bảo trang của tôi được hiển thị trước khi nó bắt đầu tranh cãi với mã độc hại, không biết đây có phải là cách tiếp cận tốt nhất không, YMMV.

Làm thế nào nó hoạt động?

... Tôi nghe bạn hỏi - câu trả lời trung thực là, tôi không thực sự biết. Phải mất rất nhiều thời gian để làm cho nó hoạt động ở mọi nơi tôi đang thử nghiệm, và hiệu quả chính xác là nó có thay đổi một chút tùy thuộc vào nơi bạn chạy nó.

Đây là suy nghĩ đằng sau nó:

  • Đặt một chức năng để chạy ở khoảng thời gian thấp nhất có thể. Khái niệm cơ bản đằng sau bất kỳ giải pháp thực tế nào tôi đã thấy là lấp đầy lịch trình với nhiều sự kiện hơn khung buster-buster có.
  • Mỗi khi chức năng kích hoạt, hãy thử và thay đổi vị trí của khung trên cùng. Yêu cầu khá rõ ràng.
  • Đồng thời lên lịch cho một chức năng để chạy ngay lập tức, sẽ mất nhiều thời gian để hoàn thành (do đó ngăn chặn buster-buster khung không can thiệp vào thay đổi vị trí). Tôi đã chọn một XMLHttpRequest đồng bộ vì đó là cơ chế duy nhất tôi có thể nghĩ về điều đó không yêu cầu (hoặc ít nhất là yêu cầu) tương tác người dùng và không nhai thời gian CPU của người dùng.

Đối với tôi http://mysite.tld/page-that-takes-a-while-to-load(mục tiêu của XHR) tôi đã sử dụng một tập lệnh PHP trông như thế này:

<?php sleep(5);

Chuyện gì xảy ra

  • Chrome và Firefox đợi 5 giây trong khi XHR hoàn thành, sau đó chuyển hướng thành công tới URL của trang được đóng khung.
  • IE chuyển hướng khá nhiều ngay lập tức

Bạn có thể tránh thời gian chờ đợi trong Chrome và Firefox không?

Rõ ràng là không. Lúc đầu, tôi đã chỉ XHR tới một URL sẽ trả về 404 - điều này không hoạt động trong Firefox. Sau đó, tôi đã thử sleep(5);cách tiếp cận mà cuối cùng tôi đã đạt được câu trả lời này, sau đó tôi bắt đầu chơi xung quanh với độ dài giấc ngủ theo nhiều cách khác nhau. Tôi không thể tìm thấy mô hình thực sự nào cho hành vi, nhưng tôi đã thấy rằng nếu nó quá ngắn, cụ thể là Firefox sẽ không chơi bóng (Chrome và IE dường như hoạt động khá tốt). Tôi không biết định nghĩa của "quá ngắn" là gì trong thực tế, nhưng 5 giây dường như hoạt động mọi lúc.


Nếu bất kỳ ninja Javascript nào muốn giải thích rõ hơn một chút về những gì đang diễn ra, tại sao điều này (có thể) sai, không đáng tin cậy, mã tồi tệ nhất họ từng thấy, v.v. Tôi sẽ vui vẻ lắng nghe.


Có vẻ như bạn có thể xóa tất cả các câu đáng lo ngại của mình
mplungjan

6

Kể từ năm 2015, bạn nên sử dụng frame-ancestorschỉ thị của CSP2 cho việc này. Điều này được thực hiện thông qua một tiêu đề phản hồi HTTP.

ví dụ

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

Tất nhiên, chưa có nhiều trình duyệt hỗ trợ CSP2, vì vậy nên bao gồm X-Frame-Optionstiêu đề cũ :

X-Frame-Options: DENY

Tôi sẽ khuyên bạn nên bao gồm cả hai, nếu không trang web của bạn sẽ tiếp tục dễ bị tấn công Clickjacking trong các trình duyệt cũ và tất nhiên bạn sẽ nhận được khung không mong muốn ngay cả khi không có mục đích xấu. Hầu hết các trình duyệt đều tự động cập nhật vào những ngày này, tuy nhiên bạn vẫn có xu hướng khiến người dùng doanh nghiệp bị mắc kẹt trên các phiên bản Internet Explorer cũ vì lý do tương thích ứng dụng cũ.


1
Tất cả các trình duyệt chính hiện nay đều hỗ trợ CSP. Đây là câu trả lời chính xác trong năm 2019 và tương lai khó lường.
Stephen R

5

Ok, vì vậy chúng tôi biết rằng đã ở trong một khung. Vì vậy, chúng tôi location.href đến một trang đặc biệt khác với đường dẫn là biến GET. Bây giờ chúng tôi giải thích cho người dùng những gì đang diễn ra và cung cấp một liên kết với tùy chọn target = "_ TOP". Nó đơn giản và có thể sẽ hoạt động (chưa thử nghiệm), nhưng nó đòi hỏi một số tương tác của người dùng. Có lẽ bạn có thể chỉ ra trang web vi phạm cho người dùng và tạo ra sự xấu hổ về các trình kích nhấp chuột vào trang web của bạn ở đâu đó .. Chỉ là một ý tưởng, nhưng nó hoạt động vào ban đêm ..


5

Tất cả các giải pháp đề xuất trực tiếp buộc thay đổi vị trí của cửa sổ trên cùng. Điều gì nếu một người dùng muốn khung hình ở đó? Ví dụ: khung trên cùng trong kết quả hình ảnh của các công cụ tìm kiếm.

Tôi đã viết một nguyên mẫu trong đó theo mặc định tất cả các đầu vào (liên kết, biểu mẫu và các yếu tố đầu vào) bị vô hiệu hóa và / hoặc không làm gì khi được kích hoạt.

Nếu phát hiện khung chứa, các đầu vào bị vô hiệu hóa và thông báo cảnh báo được hiển thị ở đầu trang. Thông báo cảnh báo có chứa một liên kết sẽ mở một phiên bản an toàn của trang trong một cửa sổ mới. Điều này ngăn trang được sử dụng để nhấp chuột, trong khi vẫn cho phép người dùng xem nội dung trong các tình huống khác.

Nếu không có khung chứa nào được phát hiện, các đầu vào được bật.

Đây là mã. Bạn cần đặt các thuộc tính HTML tiêu chuẩn thành các giá trị an toàn và thêm các thuộc tính bổ sung có chứa các giá trị thực tế. Nó có thể không đầy đủ và đối với các thuộc tính bổ sung an toàn đầy đủ (tôi đang nghĩ về các trình xử lý sự kiện) có thể sẽ phải được xử lý theo cùng một cách:

<!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>

Vấn đề với điều này là trình tạo khung có thể sử dụng vị trí: tuyệt đối để đặt nút kích hoạt lên trên các nút không hoạt động của bạn và người dùng sẽ chỉ nhìn thấy trang web của bạn và nghĩ rằng họ đang nhấp vào nút CỦA BẠN.
jmucchiello

Thông báo cảnh báo vẫn sẽ được hiển thị, nhưng tất nhiên có thể dễ dàng bao phủ liên kết đến trang an toàn như bạn đề xuất. Nhưng tại sao phải trải qua tất cả các rắc rối khi đóng khung trang của tôi để khiến mọi người nhấp vào nút quen thuộc nếu bạn chỉ có thể sao chép trang và đạt được hiệu quả tương tự? Các mã ở trên chủ yếu ngăn chặn clickjacking. Nếu bạn hiển thị trang của tôi vô hình phía trên một trang khác thì không thể gọi các hành động trên trang web của tôi.
Johan Stuyts

Nếu điều này được đặt trong khung vùng giới hạn IE8 hoặc khung hộp cát Chrome, Javascript sẽ không bao giờ chạy. Tôi tự hỏi những sửa đổi nào là cần thiết trong những trường hợp đó
goodguys_activate

4

Vâng, bạn có thể sửa đổi giá trị của bộ đếm, nhưng đó rõ ràng là một giải pháp dễ vỡ. Bạn có thể tải nội dung của mình qua AJAX sau khi bạn xác định trang web không nằm trong một khung - cũng không phải là một giải pháp tuyệt vời, nhưng hy vọng sẽ tránh được sự kiện trước khi tải (tôi giả sử).

Chỉnh sửa: Một ý tưởng khác. Nếu bạn phát hiện ra bạn đang ở trong một khung, hãy yêu cầu người dùng tắt javascript, trước khi nhấp vào liên kết đưa bạn đến URL mong muốn (chuyển một chuỗi truy vấn cho phép trang của bạn biết để cho người dùng biết rằng họ có thể bật lại javascript sau khi họ ở đó).

Chỉnh sửa 2: Chuyển thành hạt nhân - nếu bạn phát hiện bạn đang ở trong một khung, chỉ cần xóa nội dung thân tài liệu của bạn và in một số thông báo khó chịu.

Chỉnh sửa 3: Bạn có thể liệt kê tài liệu hàng đầu và đặt tất cả các chức năng thành null (ngay cả những tài liệu ẩn danh) không?


Outlook (trước đây là Hotmail) 'biến thành hạt nhân' nếu nó không thể thoát ra khỏi khung - nó đặt toàn bộ nội dung <body>bên trong <plaintext>thẻ được đặt thành display: none. Nó khá hiệu quả.
uınbɐɥs

4

Nếu bạn thêm một cảnh báo ngay sau mã buster, thì cảnh báo sẽ chặn luồng javascript và nó sẽ cho phép tải trang. Đây là những gì StackOverflow làm, và nó phá hủy các iframe của tôi, ngay cả khi tôi sử dụng buster nhộn nhịp khung hình. Nó cũng làm việc với trang thử nghiệm đơn giản của tôi. Điều này chỉ được thử nghiệm trong Firefox 3.5 và IE7 trên windows.

Mã số:

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

3

Tôi nghĩ rằng bạn đã gần như ở đó. Bạn đã thử chưa:

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

Hay cách khác:

window.parent.prevent_bust = 0;

Lưu ý: Tôi đã không thực sự kiểm tra điều này.


1
Tôi đã chỉnh sửa mẫu mã của bạn (thử nghiệm dành cho cha mẹ dường như không thành công) nhưng phiên bản chỉnh sửa DOES dường như hoạt động!
Jeff Atwood

1
Mát mẻ. Luôn luôn khó khăn để trả lời với mã chưa được kiểm tra - ít nhất tôi làm điều đó để hiểu ý - và để người hỏi nghèo gỡ lỗi. :)
Jeff Meatball Yang

12
Sẽ không hoạt động nếu cha mẹ ở trên một miền khác, đó có thể là trường hợp!
Josh Stodola

2

Điều gì về việc gọi buster nhiều lần là tốt? Điều này sẽ tạo ra một điều kiện cuộc đua, nhưng người ta có thể hy vọng rằng buster xuất hiện trên đỉnh:

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

2

Nếu bạn nhìn vào các giá trị được trả về bởi setInterval()chúng thường là các chữ số đơn, vì vậy bạn thường có thể vô hiệu hóa tất cả các ngắt như vậy bằng một dòng mã:

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


0

setInterval và setTimeout tạo khoảng thời gian tăng tự động. Mỗi lần setTimeout hoặc setInterval được gọi, con số này tăng lên một, để nếu bạn gọi setTimeout, bạn sẽ nhận được giá trị cao nhất hiện tại.

   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";
   }

Vì gần như chưa từng thấy có 10000 setInter đạn và setTimeout hoạt động đồng thời và vì setTimeout trả về "khoảng thời gian cuối hoặc thời gian chờ được tạo + 1" và vì top.clearInterval vẫn có thể truy cập được, nên điều này sẽ đánh bại các cuộc tấn công mũ đen vào khung các trang web được mô tả ở trên.


0

Sử dụng htaccess để tránh các bộ khung, iframe và bất kỳ nội dung nào như hình ảnh.

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

Điều này sẽ hiển thị một trang bản quyền thay vì dự kiến.


Điều này phụ thuộc vào người giới thiệu không phải lúc nào cũng được đặt (do cài đặt trình duyệt hoặc tiện ích mở rộng hoặc đơn giản vì trang giới thiệu đang sử dụng HTTPS mà không sử dụng <meta name="referrer" …/>và b) cũng được đặt khi nhấp vào liên kết, do đó bạn cũng không cho phép liên kết đến trang của mình và ngắt Trang web.
Martin
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.