iframe에서 상위 URL에 액세스


187

좋아, 나는 페이지를 가지고 있고이 페이지에는 iframe이있다. 내가해야 할 일은 iframe 페이지에서 메인 페이지의 URL이 무엇인지 확인하십시오.

검색 한 결과 크로스 사이트 스크립팅이므로 iframe 페이지가 다른 도메인에 있으면 이것이 불가능하다는 것을 알고 있습니다. 그러나 내가 읽은 곳마다 iframe 페이지가 부모 페이지와 동일한 도메인에 있으면 예를 들어 그렇게하면 작동해야한다고 말합니다.

parent.document.location
parent.window.document.location
parent.window.location
parent.document.location.href

같은 정보를 얻는 여러 가지 방법이있는 것처럼 ... 또는 다른 유사한 콤보.

어쨌든 여기에 문제가 있습니다. 내 iframe이 기본 페이지와 동일한 도메인에 있지만 동일한 SUB 도메인에 없습니다. 예를 들어

http : // www.mysite.com/pageA.html

내 iframe URL은

http : // qa-www.mysite.com/pageB.html

pageB.html(iframe 페이지) 에서 URL을 가져 오려고 할 때 동일한 액세스 거부 오류가 계속 발생합니다. 따라서 하위 도메인조차도 크로스 사이트 스크립팅으로 간주되거나 정확합니까, 아니면 내가 잘못하고 있습니까?


프레임 URL로 전달할 수 있습니까? 같은<iframe src="url?parent=parent-url"></iframe>
비아 지오 Arobba

답변:


21

당신은 맞습니다. iframe을 사용할 때 하위 도메인은 여전히 ​​별도의 도메인으로 간주됩니다. 를 사용하여 메시지를 전달할 수 postMessage(...)있지만 다른 JS API는 의도적으로 액세스 할 수 없습니다.

상황에 따라 URL을 가져올 수도 있습니다. 자세한 내용은 다른 답변을 참조하십시오.


1
좋아, 그냥 불면. . 그러나 (편집 주셔서 감사합니다, 미안에 대한 태그 내 물건을 넣어하지 않음) 적어도 내가 미친 :( 잘 아, 계획 B. 덕분 않을거야 알
chronofwar

9
이것이 어떻게 정답입니까? 가능한 해결책에 대한 더 나은 설명이 아래에 있습니다.
Anoyz

1
동의했다! 80 표로 아래의 답변이 훨씬 좋습니다. 이 답변은 html 사양에 있습니다.
Ligemer

4
부모와 iframe 모두에 다음 스크립트를 추가해야합니다. <script> document.domain = "mydomain.com"; </ script>
George

2
"자세한 내용은 다른 답변을 참조하십시오." hahah 그것은 같습니다 : 나는 해결책이 없으며 다른 대답을 보지만 내 대답도 받아들입니다.
Milad

371

예, iframe과 기본 페이지가 동일한 (하위) 도메인에 있지 않으면 상위 페이지의 URL에 액세스 할 수 없습니다. 그러나 기본 페이지의 URL (예 : 브라우저 URL) 만 필요한 경우 다음을 시도해보십시오.

var url = (window.location != window.parent.location)
            ? document.referrer
            : document.location.href;

노트 :

window.parent.location허용된다; href속성 에 액세스하여 발생하는 OP의 보안 오류를 방지합니다 window.parent.location.href. "원점을 가진 프레임이 차단되었습니다 ..."

document.referrer"이 페이지에 링크 된 페이지의 URI"를 나타냅니다. 이 수도 없습니다다른 소스가 위치를 결정한 경우 포함 문서를 반환iframe . 예를 들면 다음과 같습니다.

  • 컨테이너 iframe @ 도메인 1
  • 자식 iframe을 도메인 2로 보냅니다.
  • 그러나 자식 iframe에서 ... 도메인 2는 도메인 3 (예 : 인증, 아마도 SAML)으로 리디렉션 한 다음 도메인 3이 지시합니다. 다시 도메인 2로 다시 전송합니다 (예 : 표준 제출 SAML 기술을 통해 양식 제출 ()).
  • 자식 iframe의 경우 포함 도메인 1이 아닌 document.referrer도메인 3 이 됩니다.

document.location"문서의 URL에 대한 정보를 포함하는 Location 객체"를 나타냅니다. 아마도 현재 문서, 즉 현재 열려있는 iframe 일 것입니다. 때 window.location === window.parent.location다음은 iframe의이 href는 IS 같은 포함하는 부모의로 href.


1
@ jepser는 iframe이 iframe 안에 있기 때문입니다. 중간에 그 프레임이있는 최상위 프레임에 액세스 할 수 없습니다. 중첩 된 교차 도메인 iframe이 너무 많은 수준에서 잘못되었습니다. 그러나 document.domain상단 프레임과 가장 안쪽 프레임 을 설정하면 문제를 해결할 수 있습니다 . 아마도.
gcb

2
또는 좀 더 간결하게 :var url = (parent !== window) ? document.referrer : document.location;
thekingoftruth

2
컨테이너가 로컬 호스트에 있거나 (일반적으로이 페이지가 웹 서버에 의해 열려 있지 않은 경우) file : //로 호출되면 작동하지 않습니다.
기 illa 르노 울트

5
Referer-Policy헤더를 사용하면이 문제를 해결할 수 있습니다 .
Dan Atkinson

2
이것은 에지 브라우저에서 작동하지 않는 것 - 레퍼러가 빈 문자열 .. 될 것 stackoverflow.com/questions/24169219/...
다비드 ORAZIO Montersino

51

방금이 문제에 대한 해결 방법을 발견했지만 너무 언급이있는 곳에서는 토론을 찾지 못했습니다. 부모 프레임의 제어가 필요합니다.

iFrame에서 다음 iframe을 원한다고 가정하십시오. src = "http://www.example.com/mypage.php"

글쎄, iframe을 지정하기 위해 HTML 대신 자바 스크립트를 사용하여 iframe에 대한 HTML을 작성하고 "빌드 타임에"자바 스크립트를 통해 부모 URL을 가져 와서 src 대상의 쿼리 문자열에 URL GET 매개 변수로 보냅니다. 그래서:

<script type="text/javascript">
  url = parent.document.URL;
  document.write('<iframe src="http://example.com/mydata/page.php?url=' + url + '"></iframe>');
</script>

그런 다음 URL 문자열을 구문 분석하여 사용자가 url 변수를 가져 오는 Javascript URL 구문 분석 함수를 찾으십시오 (이 경우 "url").

나는 여기에 훌륭한 URL 문자열 파서를 발견했다 : http://www.netlobo.com/url_query_string_javascript.html


이 답변은 stackoverflow.com/a/7739035/216084 와 결합 하여 작업을 완료합니다.

2
이것은 훌륭한 제안이었습니다. 부모 html iframe 코드를 작성하는 사람들에게는 비용이 많이들 것입니다. 우리는 픽셀 소프트웨어에서 매우 비슷한 것을 사용했습니다.
Ligemer 2014

감사합니다!! 이것은 여전히 ​​교차 사이트 규칙을 준수하는 효과적인 해결 방법입니다.
theUtherSide

그러나 서버에서 HTML의 모든 URL을 다시 작성합니까? 그렇지 않으면 사용자가 iFrame에서 링크를 클릭해도 여전히 액세스 할 수 없기 때문입니다.
Roel

@Roel 당신은 서버 시간에 그것들을 모두 쓸 수있다 (본질적으로이 답변 "하드 코드"), 또는이 답변은 자바 스크립트에서 할 수있다. 예를 들어 페이지가로드 된 후에 원하는 iframe을 주입한다.
rogerdpack

34

iframe이 다른 도메인 (크로스 도메인)에서 온 경우 다음을 사용하면됩니다.

var currentUrl = document.referrer;

그리고-여기에 주요 URL이 있습니다!


iFrame 자체가 동적으로 생성되었거나 다른 속임수를 사용했다고 생각하기 때문에 제 경우에는 작동하지 않았습니다. 나는 어떤 기대로도 대답을 얻지 못했습니다.
Muskie

이것은 모든 브라우저에서 작동합니다. 최신 브라우저에서 샌드 박스 매개 변수를 보내지 않는 한 그렇지 않은 경우가 있습니다. 이것은 도메인 간 상관없이 작동합니다.
gcb

iframe 내부의 페이지가 자바 스크립트 (예 :)를 통해 다시로드되면 window.location.reload(true)더 이상 작동하지 않습니다. 그런 다음 리퍼러는 iframe 자체의 URL입니다.
mori

20

동일한 도메인과 다른 하위 도메인에있는 페이지의 경우 document.domain javascript를 통해 속성을 .

부모 프레임과 iframe은 모두 document.domain을 공통적 인 것으로 설정해야합니다.

www.foo.mydomain.com, api.foo.mydomain.com각각 foo.mydomain.com또는 하나만 사용 mydomain.com하고 호환 가능할 수 있습니다 (아니, 둘 다 설정할 수는 없습니다)com 보안상의 이유로 ...)

또한 document.domain은 일방 통행 거리입니다. 다음 세 가지 명령문을 순서대로 실행하십시오.

// assume we're starting at www.foo.mydomain.com
document.domain = "foo.mydomain.com" // works
document.domain = "mydomain.com" // works
document.domain = "foo.mydomain.com" // throws a security exception

최신 브라우저는 window.postMessage를 사용하여 원본간에 대화 할 수 있지만 IE6에서는 작동하지 않습니다. https://developer.mozilla.org/en/DOM/window.postMessage


3
이 답변이 모두 가능하며이 답변이 Google 검색에 표시 될 것이므로이 답변을 수락하십시오.
Metagrapher

17

다음 줄이 작동합니다. document.location.ancestorOrigins[0]이 줄은 상위 도메인 이름을 반환합니다.


Chrome을 변경 한 후에는 이제 많은 브라우저에서 정답입니다.
Dan Atkinson

전체 URL이 아닙니다. 도메인 만
TheMaster

document.location.ancestorOriginsundefined나를 위해 돌아온다
Miguel Mota

브라우저 지원과 관련하여, 특히 2020 년 7 월 현재, ancestorOrigins는 개인 정보 보호 문제로 인해 Firefox에서 아직 지원되지 않습니다. 버그질라 기능 요청 및 토론 : bugzilla.mozilla.org/show_bug.cgi?id=1085214 . 브라우저 지원 : caniuse.com/#search=ancestorOrigins
colin moock


2

나는 이것에 문제가 있었다. 페이지가 iframe에서 처음로드 될 때 PHP와 같은 언어를 사용하는 경우$_SERVER['HTTP_REFFERER'] 세션 변수로 설정하십시오.

이렇게하면 페이지가 iframe에로드되면 페이지를로드 한 페이지의 전체 부모 URL과 쿼리 문자열을 알 수 있습니다. 크로스 브라우저 보안을 사용하면 도메인이 다르면 window.parent에서 계산하는 데 약간의 어려움이 있습니다.


2
var url = (window.location != window.parent.location) ? document.referrer: document.location;

위의 예제는 스크립트가 iframe에서 실행될 때 이전에 작동했지만 스크립트가 iframe 외부에서 실행될 때 URL을 검색하지 않았 음을 제안했지만 약간의 조정이 필요했습니다.

var url = (window.location != window.parent.location) ? document.referrer: document.location.href;

2
iframe 외부에있는 경우 상위 프레임에서 스크립트를 실행중인 경우 아무것도 확인할 필요가 없습니다.
Art3mix

1

이전 솔루션을 사용할 수 없었지만 예를 들어 iframe scr을 설정하면 다음 자바 스크립트를 사용하여 http:otherdomain.com/page.htm?from=thisdomain.com/thisfolderiframe 추출에서 할 수 있음을 알았습니다 thisdomain.com/thisfolder.

var myString = document.location.toString();
var mySplitResult = myString.split("=");
fromString = mySplitResult[1];

1

PHP $ _SERVER [ 'HTTP_REFFERER']의 문제점은 상위 페이지로 이동 한 페이지의 완전한 페이지 URL을 제공한다는 것입니다. 그것은 부모 페이지 자체와 동일하지 않습니다. 더 나쁜 것은 개인이 부모 페이지의 URL에 입력했기 때문에 때로는 http_referer가 없다는 것입니다. 따라서 yahoo.com에서 상위 페이지로 이동하면 yahoo.com은 페이지가 아닌 http_referer가됩니다.


1

$_SERVER['HTTP_REFERER']작동하지 않는 경우 (Safari를보고 있음)에서 $_SERVER['REDIRECT_SCRIPT_URI']유용한 백업을 발견했습니다.


0

크롬에서는 location.ancestorOrigins를 사용할 수 있습니다. 모든 부모 URL을 반환합니다


0

나는 그의 나이가 매우 오래되었다는 것을 알고 있지만 아무도 쿠키를 한 도메인에서 다른 도메인으로 전달하는 것을 권장하지 않습니다. 하위 도메인을 사용하는 경우 쿠키를 URL로 설정하기 만하면 기본 도메인에서 모든 하위 도메인으로 쿠키를 공유 할 수 있습니다.basedomain.com

그런 다음 쿠키를 통해 필요한 모든 데이터를 공유 할 수 있습니다.


-1

이것은 iframe src URL에 액세스하는 데 효과적이었습니다.

window.document.URL

-4

모든 부모 Iframe 함수 및 HTML 가져 오기

var parent = $(window.frameElement).parent();
        //alert(parent+"TESTING");
        var parentElement=window.frameElement.parentElement.parentElement.parentElement.parentElement;
        var Ifram=parentElement.children;      
        var GetUframClass=Ifram[9].ownerDocument.activeElement.className;
        var Decision_URLLl=parentElement.ownerDocument.activeElement.contentDocument.URL;

jQuery를 사용하지 않는 사람들을 위해이 답변을 확장 할 수 있다고는 생각하지 않습니다 (jQuery가 지난 몇 년 동안 불필요하게 증가했기 때문에 점점 증가하고 있습니다.) 적어도 나는이 답변이 jQuery에 의존하고 OP가 jQuery를 언급하지 않았다는 것을 분명히하는 것이 좋습니다.
Carnix
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.