2009. 7. 15. 19:58

다른 도메인간 부모창과 자식창 제어





익스플로러 5.5(?) 이후 부터는 스크립트로 server1.abc.com 과 live.abc.com 간의 상호 도메인이 다른 프레임이나 윈도우의 document에 관련된 작업을 시도하면 보안에러가 발생한다.

Cross-Frame Scripting 에 대한 MS의 말..
http://msdn2.microsoft.com/en-us/library/ms533028.aspx

넷스케이프 같은 경우에는 스크립트(Signed scripts)에서 브라우져자체에 포함(?)된 클래스(netscape.security.PrivilegeManager)를 호출하여 이를 해결할 수 있다고 한다.

Signed Scripts 에 대한 Mozilla의 말..
http://www.mozilla.org/projects/security/components/signed-scripts.html

그럼에도 불구하고 다른 도메인에 대한 opener 나 parent 접근이 필요할 경우에는 JavaScript 를 통해 document.domain 을 설정해 주면된다.
<script language="javascript">
    document.domain = "공통도메인명";
</script>
상호 연결 시켜야 하는 웹 페이지에 자신들의 공통된 도메인을 지정해 주면 컨트롤이 가능해진다.

만약, server1.abc.com의 open.htm이 window.open 으로 live.abc.com을 호출하고 live.abe.com 의 child.htm이 opener 로 server1.abc.com 을 접근해야 한다면
다음 스크립트를 두 페이지에 정의해 주면 되고, 스크립트는 페이지 어디에 위치해 있든지 특별한 상관은 없다.

<script language="javascript">
    document.domain = "abc.com";
</script>

※ 주의, 도메인 명을 잘못 입력한 경우에는 "잘못된 인수입니다." 라는 JavaScript 오류가 발생한다.

=========================================================================================
cross frame scripting 을 해결하는 다른 방법으로는 HTA가 있다.
html페이지가 아닌 hta(html application)페이지를 만들어야 한다.

http://msdn.microsoft.com/workshop/author/hta/hta_node_entry.asp

※ 다음은 HTA에서 javascript로 iframe의 document를 참조한 예

확장자를 hta로 저장하시고 브라우저로 실행.

<html>
<head>
  <title>hta cross scripting</title>
  <script>
    function window.onload() {
       alert(myframe.document);
    }
  </script>
</head>
<body scroll="no">
  <iframe id=myframe src="http://kin.naver.com/"></iframe>
</body>
</html>

다음에, 예를 하나 들면..
kin.naver.com을 iframe에 넣고 검색어에 "스크립트"라는 단어를 넣은 후 검색버튼을 누르게 한 HTA소스이다.

<html>
<head>
  <title>hta cross scripting</title>
  <script>
    function window.onload() {
       myframe.document.search.query.value="스크립트";
       myframe.check_query();
    }
  </script>
</head>
<body scroll="no">
  <iframe id=myframe src="http://kin.naver.com/" width=100% height=100%></iframe>
</body>
</html>