내 사이트 페이지가 iFrame의 타사 사이트 프레임을 통해로드되는 것을 방지하는 방법


81

페이지를로드하는 동안 내 페이지가 다른 사이트에 프레임으로 포함되었는지 어떻게 알 수 있습니까? 리퍼러 요청 헤더가 여기에서 나를 도울 수 없다고 생각합니까? 감사.


안녕하세요, John, 여기에 완전한 해결책이 필요하다고 말할 수는 없습니다. 방향 만 옮기면 충분합니다. 제 질문에 대한 답을 찾은 후에는 항상 답변으로 게시합니다. 이것이 커뮤니티에 참여할 수있는 유일한 방법입니다.
abovesun

참고 : 메타 태그 설정은 쓸모가 없습니다! 예를 들어, <meta http-equiv = "X-Frame-Options"content = "deny">는 효과가 없습니다. 그것을 사용하지 마십시오! 아래 예제와 같이 HTTP 헤더를 통해 설정해야만 X-Frame-Options가 작동합니다. developer.mozilla.org/fr/docs/Web/HTTP/Headers/X-Frame-Options
Hosam Elzagh

답변:


100

서버 측에서는 확인할 수 없지만 페이지가로드 된 후 자바 스크립트를 사용하여 감지 할 수 있습니다. 비교 topself, 동일하지 않은 경우 프레임에 있습니다.

또한 일부 최신 브라우저 X-FRAME-OPTIONS는 두 가지 값을 가질 수있는 헤더를 존중 합니다.

  • DENY – 페이지가 프레임에 포함되어있는 경우 렌더링되지 않도록합니다.
  • SAMEORIGIN – 페이지가 최상위 프레임 셋 홀더와 동일한 도메인에 속하지 않는 한 위와 동일합니다.

사용자는 프레임에 삽입 할 수없는 Google의 Picasa를 포함합니다.

최소 버전의 헤더를 지원하는 브라우저 :

  • IE8 및 IE9
  • 오페라 10.50
  • Safari 4
  • 크롬 4.1.249.1042
  • Firefox 3.6.9 ( NoScript가있는 이전 버전 )

2
여기에 Google 검색을 통해 우연히 들어 왔기 때문에 Firefox가 2010 년 8 월에 FF3.6.9로 X-FRAME-OPTIONS를 추가했다고 추가하겠습니다. michael-coates.blogspot.com/2010/08/…
ThePants


43

Stackoverflow에는 테스트 할 JS가 포함되어 있습니다 ( master.js). 이것은 관련 부분입니다.

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

그러나 JS를 비활성화 할 수 있습니다.


이 접근 방식은 콘텐츠를 iframe에 넣는 사람이나 iframe에서 콘텐츠를보고있는 사이트의 최종 사용자에게 메시지를 받고자 할 때 특히 유용합니다.
kevinmicke

29

위해 최신 브라우저 , 당신은 표준 CSP (콘텐츠 보안 정책을) 사용할 수 있습니다. 다음 헤더는 문서가 프레임에로드되지 않도록합니다.

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

(IE 11에는 X-접두사 가 필요합니다 ). 'none'자신의 사이트와 같이 프레이밍이 허용되는 출처로 변경할 수도 있습니다 .

이전 브라우저를 다루기 위해 @Maerlyn의 답변 과 함께 사용하는 것이 가장 좋습니다 .


1
귀하의 대답은 모든 정당한 존경심으로 충분히 명확하지 않습니다. 이 헤더 코드 또는 PHP입니까? 예를 들면.
Gary Carlyle Cook

2
@GaryCarlyleCook 페이지를 제공 할 때 브라우저에 대한 응답의 일부가되어야하는 HTTP 헤더입니다. PHP를 사용하여 보낼 수는 있지만 PHP 코드는 아닙니다. header ()
rvighne

15

자바 스크립트로 iframe에서 페이지를로드하지 못하도록 할 수 있습니다.

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

이 코드는 페이지의 iframe 컨테이너 주소를 페이지 주소로 변경하고 컨테이너가 페이지를 표시하도록합니다.


1
sandboxiframe의 속성은 이러한 프레이밍 이스케이프 해킹을 금지 할 수 있습니다. 따라서이 방법은 보안 문제가 우려되는 경우 프레임을 방지하는 안전한 방법이 아닙니다.
Frédéric

6

또는 일부 위치의 콘텐츠는 괜찮지 만 특정 사이트에서는 원하지 않는 경우 특정 도메인을 차단할 수 있습니다. 예를 들어 offendingdomain.com콘텐츠를 포함하는 경우 다음을 수행 할 수 있습니다.

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

이것은 상위 문서의 위치를 ​​확인하고 offendingdomain.com콘텐츠를 포함하고 있는지 확인합니다. 이 스크립트는 처벌로 iframe을 특정 유명한 YouTube 동영상으로 보냅니다. 실제로 그들은 단지 Rick-Rolled였습니다.


3

javascript를 사용하여 php 파일 끝에 다음 스크립트를 배치하여 iframe에로드되었는지 확인하고 경고를 표시하는 페이지로 리디렉션하거나 iframe을 사용하여 페이지를로드하면 안됨을 확인합니다.

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.