"X-Frame-Options에 의해 금지 된 디스플레이"극복


419

나는 다른 몇 페이지를 프레임 화하고보기 쉽게 단일 브라우저 창으로 통합하는 것을 목적으로하는 작은 웹 페이지를 작성 중입니다. 프레임을 만들려고하는 일부 페이지에서 프레임이 금지되고 "X-Frame-Options에서 표시가 금지되어 문서 표시가 거부되었습니다." Chrome에서 오류가 발생했습니다. 본인은 이것이 보안상의 제한 (이유 상 이유로)이며이를 변경할 권한이 없음을 이해합니다.

X-Frame-Options 헤더에 의해 넘어지지 않는 단일 창 내에 페이지를 표시하는 다른 프레이밍 또는 비 프레이밍 방법이 있습니까?


117
이들이 페이지 인 경우 프레임 리미터를 제거하십시오. 그렇지 않으면 페이지 작성자의 희망 사항을 존중하고 프레임을 구성하지 마십시오.
Marc B

Facebook 앱 에서이 오류가 발생하고 AJAX 호출을 사용하는 경우 Facebook이 태그를 사용하여 아약스 연락처로 좋아한다는 것을 읽었습니다. 링크를 변경해보십시오.
eric.itzhak

28
@MarcB Chrome 및 Firefox는 소유하지 않은 웹 사이트를 기본 UI 크롬으로 윤리적으로 프레임합니다. 이 프로그램은 또한 소유자, FWIW에게 동일한 출처 정책을 완화 할 수 있습니다. garen-checkly가 말했듯이 "저는 다른 페이지 몇 개를 짜서보기 편한 단일 브라우저 창으로 통합하기위한 작은 웹 페이지를 작성하고 있습니다." 그것은 기본적으로 웹 브라우저를 확장하고 완전히 윤리적입니다. 명시된 의도는 브라우저 창을 열고 정렬하기 위해 bash 스크립트를 작성하는 것과 다르지 않습니다.
Samuel Danielson

1
Surfly를 확인하십시오 . 필요한 것을 정확하게 수행 할 수 있습니다.
muodov

1
@MarcB 도움이되지 않습니다. OP는 페이지 작성자의 희망에 신경 쓰지 않을 수 있습니다.
flarn2006

답변:


211

비슷한 문제가있어서 자체 사이트의 콘텐츠를 iframe에 ( Colorbox 와의 라이트 박스 스타일 대화 상자로) 표시 하려고했습니다. ), 서버 전체에 "X-Frame-Options SAMEORIGIN"헤더 가있었습니다. 소스 서버가 테스트 서버에로드되지 않도록합니다.

이것은 어디에도 문서화되어 있지는 않지만 iframe하려고하는 페이지를 편집 할 수 있다면 (예를 들어, 자신의 페이지 인 경우) 모든 비활성화에서 문자열이있는 다른 X-Frame-Options 헤더를 보내기 만하면됩니다. SAMEORIGIN 또는 DENY 명령

예. PHP의 경우

<?php
    header('X-Frame-Options: GOFORIT'); 
?>

페이지 상단에 브라우저가 두 가지를 결합하여

X-Frame-Options SAMEORIGIN, GOFORIT

... 페이지를 iframe에로드 할 수 있습니다. 이것은 초기 SAMEORIGIN 명령이 서버 수준에서 설정되었을 때 작동하는 것으로 보이며 페이지 단위로 재정의하려고합니다.

모두 제일 좋다!


3
웹 사이트 주위에 프레임이있었습니다. 내 웹 사이트에서 OAUTH를 위해 Instagram으로 리디렉션합니다. Instagram이 전송하기 때문에 X-Frame-Options: SAMEORIGIN프레임 내부 에서이 작업을 수행 할 수있는 방법이 없습니다. 팝업을 사용해야합니다.
Steve Tauber

16
PHP를 사용하면 새로운 header_remove기능 을 사용하는 것이 좋습니다 (> = 5.3.0).
고양이

11
또는 전체 디렉토리에서 X-Frame-Options를 제거하려는 경우 .htaccess를 편집 할 수 있습니다. Header always unset X-Frame-Options
Jay

4
@ cawecoy : 음, 요점은 그것이 유효하지 않다는 것입니다. 그것은 잘못된 헤더를 무시하고 '열리지 않는 실패'를 브라우저에 의존합니다. 이것은 지정되지 않은 동작이며 의존하기가 매우 어렵습니다. GOFORIT(또는 기타 임의의 임의의 유효하지 않은 토큰) 서버에서 적용한 보안 조치를 의도적으로 위반하는 경우 서버를 직접 제어 할 수 있다면 (실제 공공 서비스를 위해해야 ​​할 일) 올바른 일은 서버가 헤더를 먼저 설정하지 않도록 설정하는 것입니다.
bobince

31
Chrome에서 더 이상 작동하지 않는 것 같습니다. 유효하지 않은 값은 기본값을 DENY로 설정합니다.
jamesfm

159

YouTube 동영상에 대해이 오류가 발생하면 전체 URL을 사용하는 대신 공유 옵션에서 퍼가기 URL을 사용하십시오. 그것은처럼 보일 것입니다http://www.youtube.com/embed/eCfDxZxTBW4

또한 대체 할 수 watch?v=와 함께 embed/그렇게 http://www.youtube.com/watch?v=eCfDxZxTBW4된다http://www.youtube.com/embed/eCfDxZxTBW4


14
오 진행 ... 오류가 발생하는 대신 임베드 페이지로 리디렉션하여 스크립트를 다시 작성하고 싶습니다.
joeytwiddle

122

에 Google지도를 삽입하려는 중에이 오류가 발생 하면 소스 링크 iframe에 추가 &output=embed해야합니다.


120
이는 일반적인 "솔루션"이 아닌 iframe에 Google지도를 포함시키는 경우에만 해당됩니다.
Benjamin Wohlwend

17
Google지도를 라이트 박스에 삽입해야했기 때문에이 '솔루션'은 완벽했습니다.
yitwail

5
트위터 웹 인 텐트로이 작업을 수행하려는 경우 잊어 버리십시오. "IFRAME 및 위젯 내에서 의도에 대한 링크를 제공 할 수 있지만 결과 페이지를 IFRAME에로드 할 수는 없습니다." 출처 : Twitter 웹 사이트.
Gubatron

6
다음과 같이 추가해도 페이지가로드 된 후 iframe src를로드하려고하면 작동하지 않습니다.&output=embed
pathfinder

1
이것은 내가 페이지가로드 한 후 iframe이 src에 문제가 로딩을했을 때 나를 위해 일한 @pathfinder
데이비드 사익스

61

UPDATE 2019 : 당신이 할 수있는 우회 X-Frame-Options에서 <iframe>사용 단지 클라이언트 측 자바 스크립트와 내 X-프레임 - 바이 패스 웹 구성 요소. 데모는 다음과 같습니다. Hacker News in aX-Frame-Bypass . (Chrome 및 Firefox에서 테스트되었습니다.)


3
흥미로운 해결 방법입니다. FF / Chrome / Opera에서는 잘 작동하지만 IE / Edge에서는 작동하지 않습니다. 무언가를 아는 사람이 있습니까?
수집가

7
더 이상 작동하지 않습니다. 'X-Frame-Options'를 'DENY'로 설정했기 때문에 ' news.ycombinator.com '을 프레임에 표시하지 않습니다. 예상
g.pickardou

2
@ g.pickardou Chrome 46에서 작동합니다. iframe에서 Hacker News를 볼 수 있습니다.
niutech

1
@niutech는 Chrome 64에서 페이지를 다시로드 한 후에 바이올린이 작동하지만 처음 페이지를로드 할 때 작동하지 않습니다. (시크릿 모드로 시도)
Carl Walsh

1
고마워, 이거 대단해!
앤드류 간스

23

추가

  target='_top'

페이스 북 탭의 링크로 이동하면 문제가 해결되었습니다 ...


1
다른 iframe에 포함 된 Paypal iframe과 동일한 문제가있었습니다. 지금 작동합니다! 감사합니다
Fabrizio Fortino

4
또한 target = '_ top'을 추가했지만이 솔루션의 문제점은 링크가 이제 페이스 북 캔버스없이 새 탭에서 iframe 외부에서 열립니다.
sumitkanoje



13

내가 iframe에 무 2를 삽입 시도 같은 문제가 있었다, 솔루션입니다 Site administration ► Security ► HTTP security체크Allow frame embedding


다른 방법은 실패 / 덮어 쓰기 때문에 무들 방법에 대해 잘 수행되었습니다.
ericosg

7

이것은 솔루션 녀석입니다!

FB.Event.subscribe('edge.create', function(response) {
    window.top.location.href = 'url';
});

페이스 북 앱에서 작동 한 유일한 것!



6

외부 웹 사이트를 iFrame에로드하기위한 솔루션 x 터프 옵션도 외부 웹 사이트에서 거부되도록 설정되어 있습니다.

다른 웹 사이트를 iFrame에로드하려고하면 Display forbidden by X-Frame-Options” 오류가 발생하면 실제로 서버 측 프록시 스크립트를 작성하여이를 극복 할 수 있습니다.

그만큼 srciFrame 속성은 다음과 같은 URL을 가질 수 있습니다./proxy.php?url=https://www.example.com/page&key=somekey

그런 다음 proxy.php는 다음과 같습니다.

if (isValidRequest()) {
   echo file_get_contents($_GET['url']);
}

function isValidRequest() {
    return $_SERVER['REQUEST_METHOD'] === 'GET' && isset($_GET['key']) && 
    $_GET['key'] === 'somekey';
}

이것은 일반적인 브라우저 페이지 방문과 마찬가지로 GET 요청이므로 블록을 전달합니다.

알아두기 :이 스크립트에서 보안을 향상시킬 수 있습니다. 해커가 프록시 스크립트를 통해 웹 페이지에서로드를 시작할 수 있기 때문입니다.


몇 주 전에이 작업을 수행했으며 echo를 사용할 때 외부 페이지에서 사용되는 상대 URL이 작동하지 않습니다. (당신이 메아리 전에 URL을 수정하지 않는 한이 기능을 사용하지 못할 수도 있습니다 일반적으로 CSS 및 / 또는 JS, 그래서.) 내가보고 싶었어요하지 않는 무언가를 ...
ultrageek

왜 이런 일이 발생하는지 잘 모르겠습니다. 최종 사용자가 URL을 방문 할 때 수행하는 것처럼 일반적인 HTTP 요청처럼 작동합니다. 따라서 get_file_contents ()의 결과는 완전히 작동하는 HTML 페이지 여야합니다.
플로리스

5

나는 거의 모든 제안을 시도했다. 그러나 실제로 문제를 해결 한 유일한 것은 다음과 같습니다.

  1. .htaccessPHP 파일이있는 동일한 폴더에를 만듭니다 .

  2. 이 줄을 htaccess에 추가하십시오.

    Header always unset X-Frame-Options

다른 도메인에서 iframe으로 PHP를 임베드하면 나중에 작동합니다.

또한 PHP 파일의 시작 부분에 추가 할 수 있습니다.

header('X-Frame-Options: ALLOW');

그러나 내 경우에는 필요하지 않았습니다.


헤더는 항상 해제 X-프레임 - 옵션 htaccess로에서 나를 위해 속임수를 썼는지
ujwal dhakal

4

mediawiki와 동일한 문제가 있었는데, 이는 보안상의 이유로 서버가 페이지를 iframe에 삽입하는 것을 거부했기 때문입니다.

나는 그것을 작성했다

$wgEditPageFrameOptions = "SAMEORIGIN"; 

미디어 위키 PHP 설정 파일로.

도움이 되길 바랍니다.


3

FWIW :

iFrame이 "브레이커"코드가 나타 났을 때 우리를 죽여야 할 상황 이있었습니다. 따라서 PHP function get_headers($url);를 사용하여 원격 URL을 확인하기 전에 원격 URL을 확인했습니다 iFrame. 더 나은 성능을 위해 결과를 파일에 캐시하여 매번 HTTP 연결을 만들지 않았습니다.


3

Tomcat 8.0.30을 사용하고 있었지만 제안 사항이 저에게 효과적이지 않았습니다. 를 업데이트하고 X-Frame-Options로 설정하려고했지만 ALLOW여기에 iframe 삽입을 허용하도록 구성한 방법이 있습니다.

  • Tomcat conf 디렉토리로 이동하여 web.xml 파일을 편집하십시오.
  • 아래 필터를 추가하십시오.
<filter>
            <filter-name>httpHeaderSecurity</filter-name>
            <filter-class>org.apache.catalina.filters.HttpHeaderSecurityFilter</filter-class>
                   <init-param>
                           <param-name>hstsEnabled</param-name>
                           <param-value>true</param-value>
                   </init-param>
                   <init-param>
                           <param-name>antiClickJackingEnabled</param-name>
                           <param-value>true</param-value>
                   </init-param>
                   <init-param>
                           <param-name>antiClickJackingOption</param-name>
                           <param-value>ALLOW-FROM</param-value>
                   </init-param>
            <async-supported>true</async-supported>
       </filter>

       <filter-mapping>
                   <filter-name>httpHeaderSecurity</filter-name>
                   <url-pattern>/*</url-pattern>
                   <dispatcher>REQUEST</dispatcher>
       </filter-mapping> 
  • Tomcat 서비스를 다시 시작하십시오.
  • iFrame을 사용하여 리소스에 액세스하십시오.

2

답이 많은 유일한 질문입니다. 마감일에 밤 10시 30 분에 작동하도록하기 위해 스크램블 할 때 갖고 싶었던 가이드에 오신 것을 환영합니다 ... FB는 캔버스 앱으로 이상한 일을하고 있습니다. 잘 경고했습니다. 여전히 여기 있고 Facebook Canvas 뒤에 나타날 Rails 앱이 있다면 다음이 필요합니다.

젬 파일 :

gem "rack-facebook-signed-request", :git => 'git://github.com/cmer/rack-facebook-signed-request.git'

config / facebook.yml

facebook:
  key: "123123123123"
  secret: "123123123123123123secret12312"

config / application.rb

config.middleware.use Rack::Facebook::SignedRequest, app_id: "123123123123", secret: "123123123123123123secret12312", inject_facebook: false

config / initializers / omniauth.rb

OmniAuth.config.logger = Rails.logger
SERVICES = YAML.load(File.open("#{::Rails.root}/config/oauth.yml").read)
Rails.application.config.middleware.use OmniAuth::Builder do
  provider :facebook, SERVICES['facebook']['key'], SERVICES['facebook']['secret'], iframe:   true
end

application_controller.rb

before_filter :add_xframe
def add_xframe
  headers['X-Frame-Options'] = 'GOFORIT'
end

Facebook의 캔버스 설정에서 호출하려면 컨트롤러가 필요 /canvas/합니다 SiteController.이 앱을 사용 하여 경로를 기본 으로 설정했습니다.


class SiteController < ApplicationController
  def index
    @user = User.new
  end
  def canvas
    redirect_to '/auth/failure' if request.params['error'] == 'access_denied'
    url = params['code'] ? "/auth/facebook?signed_request=#{params['signed_request']}&state=canvas" : "/login"
    redirect_to url
  end
  def login
  end
end

login.html.erb


<% content_for :javascript do %>
  var oauth_url = 'https://www.facebook.com/dialog/oauth/';
  oauth_url += '?client_id=471466299609256';
  oauth_url += '&redirect_uri=' + encodeURIComponent('https://apps.facebook.com/wellbeingtracker/');
  oauth_url += '&scope=email,status_update,publish_stream';
console.log(oauth_url);
  top.location.href = oauth_url;
<% end %>

출처

  • 내가 생각하는 구성은 omniauth의 예에서 나온 것입니다.
  • gem 파일 (key !!!)은 다음과 같습니다 .
  • 이 스택 질문에는 전체 Xframe 각도가 있으므로이 헤더를 앱 컨트롤러에 넣지 않으면 빈 공간이 생깁니다.
  • 그리고 내 남자 @rafmagana는이 heroku 안내서를 썼습니다.이 안내서 는이 대답과 함께 걷는 거인의 어깨로 레일을 채택 할 수 있습니다.

2

target = '_ parent'

Kevin Vella의 아이디어를 사용하여 PayPal의 버튼 생성기로 만든 요소를 ​​형성하기 위해 해당 속성을 추가하려고했습니다. Paypal이 새 브라우저 창 / 탭에서 열리지 않도록 나를 위해 일했습니다.


불행히도 이것은 사파리에서도 작동하지 않는 것 같습니다.
Wtower

1

그것이 얼마나 관련성이 있는지 잘 모르겠지만, 이에 대한 해결 방법을 마련했습니다. 내 사이트에서 URL을로드하는 iframe이 포함 된 모달 창에 링크를 표시하려고했습니다.

내가 한 것은 링크의 클릭 이벤트를이 자바 스크립트 함수에 연결하는 것입니다. 이 모든 작업은 모달 창에 URL을로드할지 리디렉션 할지를 결정하기 전에 URL 헤더에서 X-FRAME-Options를 확인하는 PHP 파일을 요청합니다.

기능은 다음과 같습니다.

  function opentheater(link, title){
        $.get( "url_origin_helper.php?url="+encodeURIComponent(link), function( data ) {
  if(data == "ya"){
      $(".modal-title").html("<h3 style='color:480060;'>"+title+"&nbsp;&nbsp;&nbsp;<small>"+link+"</small></h3>");
        $("#linkcontent").attr("src", link);
        $("#myModal").modal("show");
  }
  else{
      window.location.href = link;
      //alert(data);
  }
});


        }

이를 확인하는 PHP 파일 코드는 다음과 같습니다.

<?php
$url = rawurldecode($_REQUEST['url']);
$header = get_headers($url, 1);
if(array_key_exists("X-Frame-Options", $header)){
    echo "nein";
}
else{
    echo "ya";
}


?>

도움이 되었기를 바랍니다.


1

워드 프레스 웹 사이트를 실행할 때이 문제가 발생했습니다. 나는 모든 종류의 문제를 해결하기 위해 노력했지만 어떻게 궁극적으로 문제는 마스킹과 함께 DNS 전달을 사용하고 외부 사이트에 대한 링크가 올바르게 처리되지 않았기 때문에 발생했는지 확실하지 않았습니다. 즉, 내 사이트는 http : //123.456.789/index.html 에서 호스팅 되었지만 http://somewebSite.com/index.html 에서 실행되도록 마스크되었습니다 . 브라우저에서 http : //123.456.789/index.html 을 입력 하면 동일한 링크를 클릭하면 JS 콘솔에서 X-frame-origins 문제가 발생하지 않지만 http://somewebSite.com/index.html을 실행하면했다. 제대로 마스크하려면 호스트의 DNS 이름 서버를 도메인 서비스에 추가해야합니다. 예를 들어 godaddy.com의 경우 이름 서버 (예 : ns1.digitalocean.com, ns2.digitalocean.com, ns3.digitalocean.com)가 있어야합니다. digitalocean.com을 호스팅 서비스로 사용합니다.


1
나는 결국 : remove_action( 'admin_init', 'send_frame_options_header',10);이 문제를 우회하기 위해 ...
majick

1

Apache서버 설정 ( *.conf파일) 또는 .htaccess파일 자체를이 오류의 원인으로 언급 한 사람은 아무도 없습니다 . .htaccess또는 Apache구성 파일을 검색 하여 다음으로 설정되어 있지 않은지 확인하십시오 DENY.

Header always set X-Frame-Options DENY

로 변경하면 SAMEORIGIN예상대로 작동합니다.

Header always set X-Frame-Options SAMEORIGIN


그것은 전에 언급되었습니다-답변에 대한 @Jay의 의견을보십시오 stackoverflow.com/a/6767901/1875965
Sandra

.conf 파일을 구성합니다. 헤더는 항상 X-Frame-Options를 설정합니다.
GeekHades

그러나 이것이 외부 서버에서 클라이언트로 직접 헤더를 가져 오는 질문 과 어떻게 관련이 있습니까? 뭔가 빠졌습니까?
Sz.

1

iframe에서 원하는 소스의 헤더를 제어하지 않으면 유일한 대답은 프록시하는 것입니다. 서버가 클라이언트 역할을하고, 소스를 받고, 문제가있는 헤더를 제거하고, 필요한 경우 CORS를 추가 한 다음, 자신의 서버를 핑하십시오.

그러한 프록시를 작성하는 방법을 설명하는 다른 답변이 있습니다. 어렵지는 않지만 누군가 전에이 작업을 수행해야한다고 확신했습니다. 어떤 이유로 든 찾기가 어려웠습니다.

마침내 몇 가지 출처를 찾았습니다.

https://github.com/Rob--W/cors-anywhere/#documentation

^ 선호합니다. 드문 사용법이 필요하다면 그의 heroku 앱을 사용할 수 있다고 생각합니다. 그렇지 않으면 자신의 서버에서 직접 실행하는 코드입니다. 한계가 무엇인지 확인하십시오.

whateverorigin.org

^ 두번째 선택, 그러나 아주 오래된. 아마도 파이썬에서 가장 새로운 선택 : https://github.com/Eiledon/alloworigin

그런 다음 세 번째 선택이 있습니다.

http://anyorigin.com/

약간의 무료 사용을 허용하는 것 같지만 지불하지 않으면 지정되지 않은 금액을 사용하지 않으면 공공 부끄러운 목록에 표시됩니다.


0

언급되지 않았지만 어떤 경우에는 도움이 될 수 있습니다.

var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
    if (xhr.readyState !== 4) return;
    if (xhr.status === 200) {
        var doc = iframe.contentWindow.document;
        doc.open();
        doc.write(xhr.responseText);
        doc.close();
    }
}
xhr.open('GET', url, true);
xhr.send(null);

0

header()기능 대신 아래에 주어진이 줄을 사용하십시오 .

echo "<script>window.top.location = 'https://apps.facebook.com/yourappnamespace/';</script>";

0

이 문제가 발생하여 httd.conf를 편집하여 해결했습니다.

<IfModule headers_module>
    <IfVersion >= 2.4.7 >
        Header always setifempty X-Frame-Options GOFORIT
    </IfVersion>
    <IfVersion < 2.4.7 >
        Header always merge X-Frame-Options GOFORIT
    </IfVersion>
</IfModule>

SAMEORIGIN을 GOFORIT로 변경하고 서버를 다시 시작했습니다.


-1

이 일을 시도해보십시오, 나는 누군가가 주제에서 이것을 제안했다고 생각하지 않습니다. 이것은 문제의 70 %와 같이 해결 될 것입니다. 다른 페이지의 경우 스크랩해야합니다. 전체 솔루션이 있지만 공개적이지 않습니다.

아래에 iframe에 추가

sandbox = "allow-same-origin allow-scripts 허용 팝업 허용 양식"


1
샌드 박싱은 권한을 줄이고 추가하지는 않습니다. html5rocks.com/en/tutorials/security/sandboxed-iframes
Kyle Baker

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