Tôi biết rằng MessageEvent
có thuộc tính source
là đối tượng cửa sổ gửi thư. Bây giờ làm thế nào để có được thông tin này kiểm tra iframe trong tài liệu chính (và tất nhiên trong tài liệu chính về tin nhắn đến) là nguồn gốc của thông điệp cụ thể đó? Chỉ có tùy chọn có sẵn để kiểm tra location.href
trên đối tượng cửa sổ event.source
và sau đó lặp lại tất cả các iframe để kiểm tra xem nó có phù hợp không? Điều gì sẽ xảy ra nếu có iframe có cùng url nguồn trong tài liệu chính?cách kiểm tra từ iframe crossdomain tin nhắn (postMessage) đến từ đâu?
Trả lời
Nếu bạn cố đọc thuộc tính location.href
của iframe/cửa sổ tên miền chéo, điều này sẽ ném một ngoại lệ vì vi phạm chính sách cùng nguồn gốc. Bạn có thể ghi vào thuộc tính đó, nhưng bạn không thể đọc. Và ngay cả khi điều đó có hiệu quả, bạn sẽ gặp vấn đề với nhiều iframe với cùng một vấn đề về URL, như bạn đã đoán.
Dù sao, những gì bạn có thể làm là - thiết lập giao thức cho một số loại xác nhận gửi tin nhắn. Nói cách khác, trong khung nội tuyến nhận được thông báo X, bạn sẽ lặp qua tất cả các iframe trong tài liệu gốc và gửi một thông báo tới mỗi khung nội tuyến yêu cầu "Bạn đã gửi thư cho tôi X chưa?" và bạn sẽ lập trình tất cả các iframe để trả lời các câu hỏi như vậy. Tất nhiên, bạn sẽ phải đính kèm ID duy nhất cho tất cả thư để bạn biết iframe nào thừa nhận rằng nó đã gửi thư nào.
Tôi nghĩ rằng bạn phải suy nghĩ tại sao người nhận tin nhắn cần biết ai là người gửi, và tại sao nó không đủ để bạn chỉ biết tham chiếu đến người gửi đó (event.source
)? Nếu có một số thông tin được người gửi biết - sau đó người gửi chỉ có thể gửi thông tin này trong thư ở địa điểm đầu tiên.
cách hiệu quả hơn là chuyển các khung nội tuyến mỗi ID duy nhất trên bắt đầu và khiến chúng sử dụng id đó khi đăng lại khung chính.
Điều tôi đang làm dường như hoạt động cho đến nay trong Chrome là lặp qua tất cả các iframe trên một trang và so sánh danh tính trên các đối tượng window
của họ.
window.addEventListener('message', function(e) {
if(e.origin === 'https://www.example.com') {
var iframes = document.getElementsByTagName('iframe');
for(var i = 0; i < iframes.length; i++) {
if(e.source === iframes[i].contentWindow) {
// Do stuff with iframes[i]
}
}
}
}
Đây chưa phải là trình duyệt được kiểm tra, vì vậy số dặm của bạn có thể thay đổi.
- 1. javascript: nghe các sự kiện postMessage từ iframe cụ thể
- 2. iframe nhắn miền chéo với jQuery postMessage Plugin
- 3. cách gửi tin nhắn từ dịch vụ đến hoạt động
- 4. PostMessage từ WorkerThread đến cửa sổ chính trong MFC
- 5. Gửi tin nhắn từ ứng dụng đến người dùng facebook
- 6. Xóa một tin nhắn từ hộp thư đến
- 7. từ nào tệp phẳng đến từ đâu?
- 8. Microsoft.Practices.ServiceLocation đến từ đâu?
- 9. Cách phát hiện cảnh báo JavaScript đến từ đâu?
- 10. Kiểm tra tin nhắn WCF theo hướng gọi lại?
- 11. Kiểm tra trạng thái của tin nhắn GCM
- 12. JavaMail kiểm tra nội dung tin nhắn gmail IMAP
- 13. Kiểm tra Django - kiểm tra tin nhắn cho chế độ xem chuyển hướng
- 14. Tên 'atoi` đến từ đâu?
- 15. Tên Psycopg` đến từ đâu?
- 16. 'Hello world' đến từ đâu?
- 17. `Kích thước` đến từ đâu?
- 18. Vị trí '.' và '..' đến từ đâu?
- 19. Cách gửi tin nhắn SMS từ máy chủ
- 20. Làm cách nào để gửi tin nhắn từ máy chủ đến máy khách bằng SignalR Hubs
- 21. Nhận tin nhắn từ bưu điện
- 22. Các gói PHP Composer đến từ đâu?
- 23. C# tệp dbml đến từ đâu?
- 24. Các tin nhắn flash được lưu ở đâu?
- 25. Android - Nghe tin nhắn SMS đến
- 26. kiểm tra thời gian từ 9,30 đến 4 ruby
- 27. API iframe của Youtube không thể đăng tin nhắn
- 28. Mẫu Meteor, nó đến từ đâu?
- 29. Backward_warning.h #warning này đến từ đâu?
- 30. Kiểm tra thông tin đăng nhập từ xa và kiểm tra người dùng đã đăng nhập
Không, nếu bạn không có quyền kiểm soát người gửi, tất nhiên. Tôi có các trang với một số Vimeo nhúng ẩn trên mỗi trang. Khi người dùng nhấp vào nút để hiển thị một trong số họ, tôi cần phải đợi cho đến khi tôi nhận được thông báo "sẵn sàng" từ khung trước khi gửi tin nhắn "phát" tới đó. Nhưng nếu câu trả lời của bạn là chính xác, tôi không có cách nào để biết iframe nào cho biết nó đã sẵn sàng! Điều đó có vẻ như một sự giám sát khá lớn đối với tôi; Tôi không thể tìm ra cách nó cải thiện bảo mật theo bất kỳ cách nào và không có quyền kiểm soát trang iframe là một trường hợp sử dụng cực kỳ chuẩn. –