2016-08-04 7 views
1

이 코드가 있는데 MessageEvent의 기원을 *으로 설정했지만 콘솔 프롬프트가 여전히 표시됩니다. "AAAA"의 원본 프레임이 "BBBB"의 프레임에 액세스하지 못하도록 차단했습니다. 프로토콜, 도메인 및 포트가 일치해야합니다. 누구나 아는 이유는 무엇입니까?원본 정책과 관련하여 postMessage()와 dispatchEvent()의 차이점은 무엇입니까?

그러나 window.parent.postMessage(size, "*")을 사용하면 작동합니다.

+0

@Kaiido 여기에서 찾을 수 있습니다. 이 코드는 iframe'src'가 참조하는 외부 리소스에 배치했습니다. – Blake

+0

@Kaiido 그들은 서로 다른 영역에 있기 때문에 내가 처음에 "origin :"* "을 설정했습니다. – Blake

답변

2

오류 메시지는 다른 근원에있는 경우 교차 기원은 iframe은 일반적으로 부모의 메소드를 호출 할 수 있음을 알려줍니다; dispatchEvent 메서드를 포함합니다 (그렇지 않으면 iframe은 부모 페이지에서 마우스 이벤트를 생성 할 수 있습니다).

postMessage API는 잘 정의 된 방식으로 상호 원점 통신을 허용하도록 정확하게 설계된 그 예외이다.

(에 origin 설정 '*'여기에 도움이되지 않습니다; 메시지가 postMessage를 통해 전송 될 때 일반적으로, 그 속성은 브라우저에 의해 설정 될 것으로 예상되며, 생성 수동으로 MessageEvent 목적은 주로 유용 때를 두 문서가 동일한 기원을 가지고 있지 않은 경우

1

, 그들은 동일 출처 정책 제한으로 인한 매우 제한된 액세스 할 수 있습니다) 수신 페이지에서 외부 메시지의 수신을 시뮬레이션 할 수 있습니다. 하여 dispatchEvent() 예에서

다른 프레임 (window.parent)에 제한된 액세스 권한을 갖는다.

window.postMessage()

은 동일 출처 정책 제한을 피할 크로스 창 메시징을 수행 할 수 있습니다.

targetOrigin의 경우 window.postMessage()은 리터럴 문자열 "*"(선호 없음을 나타냄) 또는 URI로 전달할 이벤트에 대한 otherWindow의 원점을 지정합니다.

생산 코드에서 코드를보다 안전하게 보호하려면 특정 URI를 사용해야합니다. 나는 수신 측의 사용자 정의 이름을 원하기 때문에 안전하게 window.postMessage()를 사용하는 방법에 대한 자세한 내용은 https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage