Cách ngăn trang web của tôi được tải qua khung trang bên thứ 3 của iFrame


81

Làm cách nào để biết rằng trang của tôi được nhúng làm khung cho trang khác trong quá trình tải trang? Tôi đoán tiêu đề yêu cầu của người giới thiệu không thể giúp tôi ở đây? Cảm ơn.


Xin chào, John, tôi không thể nói rằng tôi cần giải pháp hoàn chỉnh ở đây, chỉ cần chuyển hướng là đủ, sau khi tôi tìm thấy câu trả lời cho câu hỏi của mình, tôi luôn đăng nó như một câu trả lời, đây là cách duy nhất tôi có thể tham gia vào cộng đồng.
tàu

Lưu ý: Đặt thẻ meta là vô ích! Ví dụ: <meta http-equiv = "X-Frame-Options" content = "allow"> không có tác dụng. Đừng sử dụng nó! Chỉ bằng cách thiết lập thông qua tiêu đề HTTP như các ví dụ bên dưới, X-Frame-Options sẽ hoạt động. developer.mozilla.org/fr/docs/Web/HTTP/Headers/X-Frame-Options
Hosam Elzagh

Câu trả lời:


100

Bạn không thể kiểm tra nó từ phía máy chủ, nhưng bạn có thể sử dụng javascript để phát hiện nó sau khi trang tải xong. So sánh topself, nếu chúng không giống nhau, bạn đang ở trong một khung.

Ngoài ra, một số trình duyệt hiện đại tôn trọng X-FRAME-OPTIONStiêu đề, có thể có hai giá trị:

  • DENY - ngăn trang được hiển thị nếu nó nằm trong khung
  • SAMEORIGIN - giống như trên, trừ khi trang thuộc cùng một miền với chủ sở hữu bộ khung cấp cao nhất.

Người dùng bao gồm Picasa của Google, không thể được nhúng vào khung.

Các trình duyệt hỗ trợ tiêu đề, với phiên bản tối thiểu:

  • IE8 và IE9
  • Opera 10.50
  • Safari 4
  • Chrome 4.1.249.1042
  • Firefox 3.6.9 (phiên bản cũ hơn với NoScript )

2
Kể từ khi tôi vấp ở đây thông qua tìm kiếm google, tôi sẽ thêm rằng Firefox thêm X-Frame-Options trong Tháng Tám, 2010 với FF3.6.9: michael-coates.blogspot.com/2010/08/...
ThePants


43

Stackoverflow bao gồm một số JS để kiểm tra nó ( master.js). Đây là phần liên quan của nó:

if(top!=self){
    top.location.replace(document.location);
    alert("For security reasons, framing is not allowed; click OK to remove the frames.")
}

Nhưng hãy nhớ rằng JS có thể bị vô hiệu hóa.


Cách tiếp cận này đặc biệt hữu ích nếu bạn muốn nhận thông báo cho người đang đưa nội dung của bạn vào iframe hoặc người dùng cuối của trang web của họ đang xem nội dung của bạn trong iframe.
kevinmicke

29

Đối với các trình duyệt hiện đại , bạn có thể sử dụng CSP (Chính sách bảo mật nội dung), đây là một tiêu chuẩn. Tiêu đề sau sẽ ngăn tài liệu tải trong khung ở bất kỳ đâu:

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

(Tuy nhiên, IE 11 cần X-tiền tố). Bạn cũng có thể thay đổi 'none'nguồn gốc được phép đóng khung, chẳng hạn như trang web của riêng bạn.

Để bao gồm các trình duyệt cũ hơn, điều này tốt nhất được sử dụng cùng với câu trả lời của @ Maerlyn .


1
Câu trả lời của bạn không đủ rõ ràng với tất cả sự tôn trọng. Đây là mã tiêu đề hay PHP? Ví dụ.
Gary Carlyle Cook

2
@GaryCarlyleCook Đây là tiêu đề HTTP phải là một phần của phản hồi đối với trình duyệt khi phân phát một trang. Nó không phải là mã PHP, mặc dù bạn có thể sử dụng PHP để gửi nó; xem tiêu đề ()
rvighne

15

bạn có thể ngăn tải trang của mình trong iframe bằng javascript

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

mã này thay đổi địa chỉ vùng chứa iframe của trang thành địa chỉ trang của bạn và buộc vùng chứa hiển thị trang của bạn.


1
sandboxthuộc tính trên iframe cho phép cấm các vụ hack thoát khung như vậy. Vì vậy, cách này không phải là một cách bảo mật để ngăn chặn việc đóng khung, trong trường hợp mối quan tâm của bạn là vấn đề bảo mật.
Frédéric

6

Hoặc bạn có thể chặn một miền cụ thể nếu bạn không bận tâm đến nội dung của mình ở một số vị trí nhưng không muốn nó trên một trang web nhất định. Ví dụ: nếu bạn offendingdomain.comđang nhúng nội dung của mình, bạn có thể làm như sau:

<script type="text/javascript">
    if(document.referrer.indexOf("offendingdomain.com") != -1) {
        window.location = "http://www.youtube.com/watch_popup?v=oHg5SJYRHA0";
    }
</script>

Điều này sẽ kiểm tra vị trí của tài liệu gốc và xem liệu đó có phải là nơi offendingdomain.comđang nhúng nội dung của bạn hay không. Tập lệnh này sau đó sẽ gửi iframe đó đến một video youtube nổi tiếng nhất định như một hình phạt. Trên thực tế, họ chỉ là Rick-Rolled mình.


3

Sử dụng javascript để kiểm tra xem nó có được tải trên iframe hay không bằng cách đặt tập lệnh sau vào cuối tệp php của bạn và chuyển hướng đến trang hiển thị cảnh báo hoặc thông báo rằng trang của bạn không được tải bằng iframe.

<script type="text/javascript">
if(top.location != window.location) {
    window.location = '/error_iframe.php';
}
</script>

-1
<?php
    header("Content-Security-Policy: frame-ancestors 'none'");
?> 
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.