document.domain = document.domain의 기능은 무엇입니까?


90

Orbited (Comet 서버) 의 클라이언트 측 JS 구성 요소 는 서버가 JS 자체에 대한 다른 도메인 또는 포트에서 실행중인 경우 다음을 실행해야합니다.

document.domain = document.domain;

다른 JS가로드되기 전에 ( 문서를 참조하십시오 .)

이것은 무엇을합니까? NOOP처럼 보입니다! (나는 확인했고 실제로 필요합니다.)

답변:


203

실제로이 코드를 작성했습니다.

교차 하위 도메인 / 포트 혜성을 시도 할 때 iframe document.domain은 상위 프레임 과 동일한 값 을 가져야합니다 . 불행히도 브라우저는 원래 document.domain값에 대해 내부적으로 도메인 이름과 포트를 저장합니다 . 그러나 javascript의 getter 및 setter는 포트에 대해 아무것도 모릅니다. 그래서 문제는 이것입니다. 만약 상단 프레임 document.domain('example.com', 80)이고 하단 프레임이 ('comet.example.com', 80)이면 하단 프레임 ('example.com', 80)도 어떻게됩니까?

호스트 이름 부분을 변경하면 반드시 포트가로 설정 null되므로 할 수 없습니다. 따라서 할 수있는 최선 ('example.com', null)은 하단 프레임에있는 것입니다. 따라서 상단 프레임도 해당 값으로 설정해야 document.domain=document.domain합니다. 그것은에서 브라우저의 내부 표현을 변경 ('example.com', 80)('example.com', null)한 후 모든 것이 최대 일치 및 크로스 포트 / 하위 프레임 통신 작동합니다.


이 솔루션은 불행히도 저에게 효과가 없었습니다 (자세한 내용은 stackoverflow.com/questions/7796767/… 참조). 모든 프레임에 'document.domain = document.domain'을 추가해도 Chrome의 동작이 변경되지 않습니다. 어떤 아이디어?
Stephen Gross

또한 js에 지연을 설정하면 적어도 두 프레임에 대해 유효한 URL을 얻을 수 있음을 알아 냈습니다. 그러나 한 프레임은 다른 프레임에 액세스 할 수 없습니다.
Stephen Gross

6
MDN에서 이상한 "숨겨진"포트가 어떻게 작동하는지에 대한 또 다른 설명이 있습니다 : developer.mozilla.org/en/Same_origin_policy_for_JavaScript
mjs

1
아, 당신은이 짜증나는 코드의 범인입니다. 이 라인 덕분에 동적으로 생성 된 iframe이 실행 된 후 (및 document.domain 설정) 동적으로 생성 된 iframe이 교차 도메인으로 설정되므로 새로 생성 된 iframe에 더 이상 액세스 할 수 없습니다. : /
crappish

@mjs yes : 포트 번호는 브라우저에 의해 별도로 유지됩니다. document.domain = document.domain을 포함하여 setter를 호출하면 포트 번호를 null로 덮어 씁니다. 따라서 처음에 document.domain = "company.com"만 설정하면 company.com:8080이 company.com과 대화 할 수 없습니다. 포트 번호가 모두 널이되도록 둘 다에 설정해야합니다.
Royi Namir

38

브라우저는 (a) 명시 적으로 설정되지 않은 경우 document.domain과 (b) 명시 적으로 설정된 경우 document.domain을 구분합니다. 동일한 값을 반환하더라도 ...

값을 명시 적으로 설정하면 다른 하위 도메인 (동일한 상위 도메인 아래)의 스크립트와 "협력"할 의도가 있음을 나타냅니다.

상위 페이지와 외부 스크립트 모두 document.domain을 동일한 값으로 명시 적으로 설정하면 동일 출처 정책 제한이 무시되고 각 스크립트는 서로의 컨텍스트의 모든 (그렇지 않으면 제한된) 개체 및 속성에 액세스 할 수 있습니다.


9

이 사이트에서 다음 정보를 찾았습니다 : devguru . 더 구체적으로 말하면 다음과 같습니다.

이 속성은 문서가 생성 된 서버의 도메인 이름을 설정하거나 반환합니다. 기본적으로 문서가 검색된 서버의 도메인 이름이 사용되지만이 이름의 접미사 (접미사 만)로 변경할 수 있습니다. 이를 통해 동일한 도메인 접미사를 공유하는 경우 서로 다른 서버에서 전달 된 문서간에 스크립트 속성을 공유하고 보안이 허용됩니다.

동일한 도메인에 대해 크로스 사이트 스크립팅을 허용하는 것 같습니다 (하위 도메인이 다른 경우에도).

document.domain을 건드리지 않으면 js 엔진은 동일한 도메인의 다른 자바 스크립트 만 허용한다고 가정합니다. 이 속성을 사용 하면 궤도 문서 상태와 같은 다른 하위 도메인 에 배포 할 수 있습니다 .


6
이유는 설명하지 않습니다 document.domain = document.domain입니다 하지 아무것도 실행.
Crescent Fresh

1
거친 추측이지만 내가 말했듯이 속성은 값으로 설정 될 때만 트리거됩니다.
Miguel Ping

6

document.domain명시 적으로 설정되지 않은 경우 실제 URL에서 기본값을 가져옵니다. 브라우저는 document.domainURL이 기본값으로 설정되었는지 또는 명시 적으로 설정되었는지 기록합니다. 둘 다 동일한 도메인에 대한 기본값이거나 둘 다 명시 적으로 동일한 도메인으로 설정되어야 작동합니다. 하나가 기본값이고 하나가 명시 적으로 설정되어있는 경우, 둘 다 읽으면 일치하는 경우 두 페이지는 여전히 서로 대화 할 수 없습니다.

참조 : https://developer.mozilla.org/en-US/docs/DOM/document.domain

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.