익스플로러 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>