Cách ngăn IFRAME chuyển hướng cửa sổ cấp cao nhất


133

Một số trang web có mã để "thoát ra" các IFRAMEbao vây, nghĩa là nếu một trang Ađược tải dưới dạng IFRAMEbên trong trang mẹ, Pmột số Javascript Asẽ chuyển hướng cửa sổ bên ngoài tới A.

Thông thường, Javascript này trông giống như thế này:

<script type="text/javascript">
  if (top.location.href != self.location.href)
     top.location.href = self.location.href;
</script>

Câu hỏi của tôi là: Là tác giả của trang mẹ Pvà không phải là tác giả của trang bên trong A, làm cách nào tôi có thể ngăn chặn Aviệc đột phá này?

PS Có vẻ như tôi nên vi phạm an ninh chéo trang, nhưng không phải vậy.


Tôi không nghĩ bạn có thể làm được gì nhiều ... nếu bạn không phải là tác giả của nội dung khung.
scunliffe

Câu trả lời:


43

Hãy thử sử dụng thuộc tính onb Beforeunload, điều này sẽ cho phép người dùng chọn xem anh ta có muốn điều hướng khỏi trang không.

Ví dụ: https://developer.mozilla.org/en-US/docs/Web/API/Window.onb Beforeunload

Trong HTML5, bạn có thể sử dụng thuộc tính hộp cát. Xin vui lòng xem câu trả lời của Pankrat dưới đây. http://www.html5rocks.com/en/tutorials/security/sandboxed-iframes/


1
khung nội tuyến làm cho phép giao tiếp giữa các miền, tuy nhiên, sử dụng postMessage. Đây không phải là rủi ro bảo mật, nhưng ai đó có thể quan tâm để biết rằng khả năng này tồn tại khi họ thấy bình luận của bạn. :)
coreyward

Tại thời điểm viết câu trả lời này là không thể. Cảm ơn vì chỉ ra điều ấy.
fasih.rana

@SirDarius bạn có thể vui lòng cho thấy một ví dụ, đánh giá rất cao.
dùng198989

Người dùng sẽ không biết tại sao xác nhận này xuất hiện và có thể sẽ chọn một phản hồi ngẫu nhiên. Tôi không khuyên bạn nên sử dụng nó. Có Giải pháp khác sandbox.
oriadam

1
@ fasih.rana Bài viết thứ hai đã giúp tôi rất nhiều. Cảm ơn bạn;)
MrD

127

Với HTML5, thuộc tính hộp cát iframe đã được thêm vào. Tại thời điểm viết bài này hoạt động trên Chrome, Safari, Firefox và các phiên bản IE và Opera gần đây nhưng thực hiện khá nhiều thứ bạn muốn:

<iframe src="url" sandbox="allow-forms allow-scripts"></iframe>

Nếu bạn muốn cho phép chuyển hướng cấp cao nhất chỉ định sandbox="allow-top-navigation".


chờ đã ... cái gì? Họ để bạn làm điều này? Tôi nghĩ nếu một trang web muốn thoát ra, tất cả các trình duyệt sẽ cho phép nó. Làm thế nào mọi người có nghĩa vụ phải giữ cho trang web của họ ra khỏi iframe với điều này xung quanh? Tôi không phàn nàn mặc dù, tuyệt vời.
Farzher

3

1
@StephenSarcsamKamenar Nếu bạn muốn bảo vệ trang web của mình khỏi bị hiển thị trong iframe, có tiêu đề X-Frame-Options có sẵn với giá trị SAMEORIGIN . Hầu hết các trình duyệt hiện đại sẽ không hiển thị trang web trong iframe với tiêu đề này.
Grzegorz

4
Thật không may sandbox, không cho phép Flash hoặc bất kỳ loại đối tượng nào khác trong khung hình hộp cát, làm cho sandboxtính năng này trở nên vô dụng trong nhiều trường hợp.
oriadam

1
Các trang web không nên "thoát ra" để phản đối việc được đưa vào iframe. Họ có thể chỉ đơn giản là hiển thị một tin nhắn hoặc để trống. Thật không may, cho phép các tập lệnh chạy trong iframe vẫn mở ra cho bạn một iframe lừa đảo đang làm trong khi (1) {} và các vòng lặp vô hạn khác. Tôi muốn mỗi iframe có thể có chủ đề riêng của mình.
Gregory Magarshak

51

Tôi sử dụng hộp cát = "..."

  • biểu mẫu cho phép biểu mẫu
  • cho phép cửa sổ bật lên cho phép cửa sổ bật lên
  • khóa con trỏ cho phép khóa con trỏ
  • allow-same-origin cho phép tài liệu duy trì nguồn gốc của nó
  • tập lệnh cho phép thực thi JavaScript và cũng cho phép các tính năng tự động kích hoạt
  • allow-top-navigation cho phép tài liệu thoát ra khỏi khung bằng cách điều hướng cửa sổ cấp cao nhất

Điều hướng hàng đầu là những gì bạn muốn ngăn chặn, vì vậy hãy bỏ qua nó và nó sẽ không được phép. Bất cứ điều gì còn lại sẽ bị chặn

Ví dụ.

        <iframe sandbox="allow-same-origin allow-scripts allow-popups allow-forms" src="http://www.example.com"</iframe>

3
Lưu ý rằng Flash (và bất kỳ đối tượng nào khác) cũng sẽ bị chặn, không có tùy chọn cho phép. "Tính năng bảo mật" này đang ngăn tôi sử dụng tất cả các hộp cát
oriadam

8

Sau khi đọc thông số w3.org . Tôi tìm thấy tài sản hộp cát.

Bạn có thể đặt sandbox="", điều này ngăn iframe chuyển hướng. Điều đó được nói rằng nó sẽ không chuyển hướng iframe. Bạn sẽ mất nhấp chuột về cơ bản.

Ví dụ ở đây: http://jsfiddle.net/ppkzS/1/
Ví dụ không có hộp cát: http://jsfiddle.net/ppkzS/


4

Tôi biết đã lâu rồi kể từ khi câu hỏi được thực hiện nhưng đây là phiên bản cải tiến của tôi, nó sẽ đợi 500ms cho bất kỳ cuộc gọi tiếp theo nào chỉ khi iframe được tải.

<script type="text/javasript">
var prevent_bust = false ;
    var from_loading_204 = false;
    var frame_loading = false;
    var prevent_bust_timer = 0;
    var  primer = true;
    window.onbeforeunload = function(event) {
        prevent_bust = !from_loading_204 && frame_loading;
        if(from_loading_204)from_loading_204 = false;
        if(prevent_bust){
            prevent_bust_timer=500;
        }
    }
    function frameLoad(){
        if(!primer){
            from_loading_204 = true;
            window.top.location = '/?204';
            prevent_bust = false;
            frame_loading = true;
            prevent_bust_timer=1000;
        }else{
            primer = false;
        }
    }
    setInterval(function() {  
        if (prevent_bust_timer>0) {  
            if(prevent_bust){
                from_loading_204 = true;
                window.top.location = '/?204';
                prevent_bust = false;
            }else if(prevent_bust_timer == 1){
                frame_loading = false;
                prevent_bust = false;
                from_loading_204 = false;
                prevent_bust_timer == 0;
            }



        }
        prevent_bust_timer--;
        if(prevent_bust_timer==-100) {
            prevent_bust_timer = 0;
        }
    }, 1);
</script>

onload="frameLoad()"onreadystatechange="frameLoad();"phải được bổ sung vào khung hoặc iframe.



2

Vì trang bạn tải bên trong iframe có thể thực thi mã "break out" với setInterval, onb Beforeunload có thể không thực tế, vì nó có thể khiến người dùng lúng túng với 'Bạn có chắc chắn muốn rời đi không?' hộp thoại.

Ngoài ra còn có thuộc tính bảo mật iframe chỉ hoạt động trên IE & Opera

:


2

Trong trường hợp của tôi, tôi muốn người dùng truy cập trang bên trong để máy chủ sẽ thấy ip của họ như một khách truy cập. Nếu tôi sử dụng kỹ thuật proxy php, tôi nghĩ rằng trang bên trong sẽ thấy ip máy chủ của tôi là khách truy cập nên không tốt. Giải pháp duy nhất tôi có được cho đến nay là onb Beforeunload. Đặt cái này trên trang của bạn:

<script type="text/javascript">
    window.onbeforeunload = function () {                       
         return "This will end your session";
    }
</script>

Điều này hoạt động cả trong firefox và tức là, đó là những gì tôi đã thử nghiệm. bạn sẽ tìm thấy các phiên bản sử dụng thứ gì đó như evt.return (bất cứ thứ gì) tào lao ... không hoạt động trong firefox.


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.