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

Cross-site Scripting 에 대한 MS의 말.. How Cross-site Scripting Attacks Work

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

Signed Scripts 에 대한 Mozilla의 말.. Signed Scripts in Mozilla

그럼에도 불구하고 다른 도메인에 대한 opener 나 parent 접근이 필요할 경우에는 JavaScript 를 통해 document.domain 을 설정해 주면된다.

<script language="javascript">
    document.domain = "공통도메인명";
</script>

상호 연결 시켜야 하는 웹 페이지에 자신들의 공통된 도메인을 지정해 주면 컨트롤이 가능해진다.

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

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

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

cross frame scripting 을 해결하는 다른 방법으로는 HTA가 있다.

html페이지가 아닌 hta(html application)페이지를 만들어야 한다.

 

※ 다음은 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>
반응형

+ Recent posts