Document.domain = document.domain làm gì?


90

Thành phần JS phía máy khách của Orbited (máy chủ Comet), yêu cầu rằng nếu máy chủ đang chạy trên một miền hoặc cổng khác với chính JS, bạn phải thực thi

document.domain = document.domain;

trước khi bất kỳ JS nào khác được tải. (Xem tài liệu .)

Điều này làm gì? Nó trông giống như một NOOP! (Tôi đã kiểm tra và thực tế là cần thiết.)

Câu trả lời:


202

Tôi thực sự đã viết mã này.

Khi cố gắng thực hiện tên miền phụ / cổng sao chổi chéo, iframe cần có cùng document.domaingiá trị với khung mẹ. Thật không may, trình duyệt lưu trữ tên miền VÀ cổng nội bộ cho document.domaingiá trị ban đầu . Nhưng getter và setter trong javascript không biết gì về cổng. Vì vậy, vấn đề là thế này: nếu khung trên document.domain('example.com', 80), và khung chốt là ('comet.example.com', 80), làm thế nào để bạn có được khung phía dưới được ('example.com', 80)không?

Bạn không thể, vì việc thay đổi phần tên máy chủ nhất thiết sẽ khiến cổng được đặt thành null, vì vậy tốt nhất bạn có thể làm là ('example.com', null)ở khung dưới cùng. Vì vậy, khung trên cùng cũng cần được đặt thành giá trị đó và cài đặt document.domain=document.domainchỉ thực hiện điều đó. Nó thay đổi biểu diễn nội bộ trong trình duyệt từ ('example.com', 80)đến ('example.com', null)và sau đó mọi thứ khớp với nhau và giao tiếp khung chéo cổng / miền phụ hoạt động.


Rất tiếc, giải pháp này đã không hoạt động đối với tôi (xem stackoverflow.com/questions/7796767/… để biết chi tiết). Thêm 'document.domain = document.domain' vào tất cả các khung không thay đổi hoạt động của Chrome. Bất kỳ ý tưởng?
Stephen Gross

Ngoài ra, tôi đã phát hiện ra rằng nếu tôi đặt độ trễ cho js của mình, thì ít nhất tôi cũng nhận được các URL trông hợp lệ cho cả hai khung. Tuy nhiên, một khung không thể truy cập vào khung kia.
Stephen Gross

6
Có một lời giải thích khác về cách hoạt động của cổng "ẩn" kỳ lạ tại MDN: developer.mozilla.org/en/Same_origin_policy_for_JavaScript
mjs

1
À, thì ra bạn là thủ phạm cho đoạn mã gây phẫn nộ này. Nhờ dòng đã nói, sau khi nó được chạy (và bộ document.domain), bất kỳ iframe nào được tạo động đều được đặt làm miền chéo và do đó, iframe mới được tạo không thể truy cập được nữa. : /
crappish

@mjs yes: Số cổng được giữ riêng bởi trình duyệt. Mọi lệnh gọi tới setter, bao gồm document.domain = document.domain khiến số cổng bị ghi đè bằng null. Do đó, người ta không thể làm cho company.com:8080 nói chuyện với company.com bằng cách chỉ đặt document.domain = "company.com" ở đầu tiên. Nó phải được đặt ở cả hai để số cổng đều rỗng.
Royi Namir

38

Các trình duyệt phân biệt giữa (a) document.domain khi không được đặt rõ ràng và (b) document.domain khi được đặt rõ ràng ... ngay cả khi chúng trả về cùng một giá trị.

Việc đặt giá trị một cách rõ ràng cho biết ý định "hợp tác" với tập lệnh trên một miền phụ khác (trong cùng một miền mẹ).

Nếu CẢ trang mẹ VÀ tập lệnh bên ngoài đặt rõ ràng document.domain thành cùng một giá trị, thì hạn chế của chính sách cùng nguồn gốc có thể bị bỏ qua và mỗi tập lệnh có thể truy cập tất cả các đối tượng và thuộc tính (nếu không thì bị hạn chế) trong ngữ cảnh của nhau.


9

Tôi tìm thấy thông tin sau trên trang web này: devguru . Cụ thể hơn, đây là câu trích dẫn:

Thuộc tính này đặt hoặc trả về tên miền của máy chủ mà tài liệu bắt nguồn từ đó. Điều này mặc định là tên miền của máy chủ mà tài liệu đã được truy xuất từ ​​đó, nhưng có thể được thay đổi thành một hậu tố (và chỉ một hậu tố) của tên này. Điều này cho phép chia sẻ các thuộc tính tập lệnh, cho phép bảo mật, giữa các tài liệu được gửi từ các máy chủ khác nhau với điều kiện chúng chia sẻ cùng một hậu tố miền.

Đối với tôi, dường như nó cho phép viết mã trang web chéo cho cùng một miền (ngay cả khi miền phụ khác nhau).

Tôi giả sử rằng nếu bạn không chạm vào document.domain, công cụ js chỉ cho phép các javascrip khác từ cùng một miền. Với thuộc tính đó, bạn sẽ có thể triển khai tới các miền phụ khác như trạng thái tài liệu được quỹ đạo.


6
Điều đó không giải thích tại sao document.domain = document.domainkhông một NOOP.
Crescent Fresh

1
Chỉ là một phỏng đoán hoang dã, nhưng như tôi đã nói, tôi đoán rằng thuộc tính chỉ được kích hoạt bất cứ khi nào nó được đặt thành một giá trị.
Miguel Ping

6

Việc document.domainlấy mặc định từ URL thực nếu không được đặt rõ ràng. Các trình duyệt sẽ ghi lại nếu document.domainnó đến làm mặc định từ URL hoặc nếu nó được đặt rõ ràng. Cả hai phải là mặc định cho cùng một miền hoặc cả hai phải được đặt rõ ràng cho cùng một miền để điều này hoạt động. Nếu một trang là mặc định và một trang được đặt rõ ràng, cả hai đều khớp nếu được đọc, thì hai trang sẽ vẫn bị cấm nói chuyện với nhau.

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.