Như đã đề cập here, bạn không nên mong đợi nguồn gốc của cha mẹ được gửi cho bạn trong thông số của postMessage
. Thay vào đó:
Nếu bạn mong đợi để nhận tin nhắn từ các trang web khác, luôn luôn xác minh danh tính của người gửi bằng cách sử dụng gốc và có thể nguồn tài sản. Bất kỳ cửa sổ nào (bao gồm, ví dụ: http://evil.example.com) có thể gửi thư đến bất kỳ cửa sổ nào khác và bạn không đảm bảo rằng người gửi không xác định sẽ không gửi thư độc hại. Tuy nhiên, khi đã xác minh số , bạn vẫn phải luôn xác minh cú pháp của thông báo đã nhận được . Nếu không, một lỗ hổng bảo mật trong trang web mà bạn tin cậy để chỉ gửi tin nhắn đáng tin cậy sau đó có thể mở một lỗ chéo trang web trong trang web của bạn.
Và khi bạn có URI của khung chính trong khung nội tuyến, bạn có thể xác minh ủy quyền của nó bằng một cuộc gọi AJAX đơn giản tới máy chủ. Theo quan điểm của tôi, một cuộc gọi máy chủ là không thể tránh khỏi và cách này hay cách khác, bạn sẽ thực hiện một cuộc gọi như vậy.
Có nhiều cách khác để biết ai đang bao gồm iframe của bạn nhưng họ không dựa trên postMessage
. Ví dụ: nếu bạn đang sử dụng PHP, bạn có thể kiểm tra $_SERVER['HTTP_REFERER']
để xem ai đang yêu cầu iframe của bạn ngay cả trước khi được gửi tới trình duyệt. Tuy nhiên, có nhiều cách để referrer spoofing.
Nếu ứng dụng của bạn yêu cầu giải pháp chống đạn vững chắc thì giao tiếp giữa máy chủ và máy chủ là cách của bạn. Trong trường hợp này, mỗi khách hàng của bạn có tên người dùng và mật khẩu và máy chủ web sẽ phục vụ trang chính nên yêu cầu mã thông báo một lần từ máy chủ web đang phục vụ iframe (đây là máy chủ liên lạc với máy chủ). Và sau đó sử dụng mã thông báo trong URL của iframe để được gửi lại cho máy chủ đã tạo nó. Dưới đây là từng bước của trường hợp này:
Người dùng cuối yêu cầu URL http://customer.com/main.php
.
Trong khi main.php
được thực hiện và Populating phản ứng, nó cũng kết nối với http://you_website.com/generate_token.php?username=cutomer1&password=123
và nhận được một đường chuyền một lần thẻ token1
.
Phản hồi được trả lại cho trình duyệt có chứa iframe có URL http://your_website.com/iframe.php?token=token1
.
Trong iframe.php
bạn xác minh token1
để xem nếu nó là hợp lệ, và , cùng một lúc, bạn đang chứng thực người yêu cầu mà không thực sự hỏi cho tên người dùng và/hoặc mật khẩu của mình (kể từ khi bạn biết những người bạn có đã tạo mã thông báo cho).
Mã thông báo như vậy thường bị xóa sau khi sử dụng (một lần) và chúng thường đi kèm với dữ liệu hết hạn. Nhưng điều đó tùy thuộc vào bạn và ứng dụng của bạn.
Tôi tin rằng bạn đã mắc lỗi trong ví dụ thứ hai của mình. Tôi nghĩ muốn nói 'postMessage ("any.domain.com", "domain.b.com") 'trong bài đăng đầu tiên của bạnMessage! – Mehran
Bạn đúng ... xin lỗi vì điều đó –
Có lý do tại sao bạn không chỉ cung cấp tên miền chính trong URL được tải trong iframe ('