Test thử PostMessage để gửi tin nhắn giữa windows và iframe

24th Feb 2022
Table of contents

Gọi một phương thức và thêm một trình xử lý sự kiện:

  • Gọi phương thức postMessage của phần tử window / iframe mà bạn muốn gửi thông tin tới.
  • Chỉ định nguồn gốc. Phải là một tên miền hoặc ký tự đại diện "*"
  • Trong cửa sổ nhận, chỉ cần thêm một trình nghe sự kiện cho sự kiện tin nhắn.
  • Tùy chọn: thêm kiểm tra nguồn gốc vì lý do bảo mật.

Mã để làm điều này

Trong ví dụ này, chúng tôi sẽ có một trang chứa một biểu mẫu, đăng một thông báo lên iframe trong trang đó.

>> PostMessage Vulnerabilities - J2EEScan – Javascript postMessage Handler Detected

Xem kết quả để tưởng tượng

PostMessage Vulnerabilities - J2EEScan – Javascript postMessage Handler Detected

Mã được sử dụng trong index.html

<form id="the-form" action="/">
    <input type="text" id="my-message" value="Your message">
    <input type="submit" value="postMessage">
</form>
 
<iframe id="da-iframe" src="postMessageTarget.html"></iframe>

window.onload = function () {
    var iframeWin = document.getElementById("da-iframe").contentWindow,
        form = document.getElementById("the-form"),
        myMessage = document.getElementById("my-message");
 
    myMessage.select();    
 
    form.onsubmit = function () {
        iframeWin.postMessage(myMessage.value, "http://robertnyman.com");
        return false;
    };
};

Mã được sử dụng trong iframe

<p id="received-message">I've heard nothing yet</p>

function displayMessage (evt) {
    var message;
    if (evt.origin !== "http://robertnyman.com") {
        message = "You are not worthy";
    }
    else {
        message = "I got " + evt.data + " from " + evt.origin;
    }
    document.getElementById("received-message").innerHTML = message;
}
 
if (window.addEventListener) {
    // For standards-compliant web browsers
    window.addEventListener("message", displayMessage, false);
}
else {
    window.attachEvent("onmessage", displayMessage);
}

postMessage có 2 thành phần chính, đó là:

  1. window.postMessage() — Để gửi message
  2. window.addEventListener(“message”,callback) — để nhận và xử lý message

Syntax chung của postMessage như sau:

targetWindow.postMessage(message, targetOrigin, [transfer]);

Tham số [transfer] là optinal, trong bài viết này chúng ta sẽ không sử dụng.

Name Description
targetWindow Reference tới một windows hoặc iframe nào đó mà bạn muốn gửi message,
message Dữ liệu cần gửi đến targetOrigin, có thể là String hoặc JSON Object (hoặc bất kỳ loại Object nào sẽ được clone trong process - HTML5 structured clone algorithm)
targetOrigin Là phần cực kỳ quan trọng, chính là URL của trang nhận message. Tại thời điểm gửi đi (postMessage), nếu targetOrigin không khớp với host name của targetWindow’s page, message sẽ không được gửi đi. Nếu chỉ định * sẽ khiến nó khớp với mọi URL, tuy nhiên không được khuyến khích bởi lý do bảo mật.
Bạn thấy bài viết này như thế nào?
1 reaction

Add new comment

Image CAPTCHA
Enter the characters shown in the image.
Câu nói tâm đắc: “Điều tuyệt với nhất trong cuộc sống là làm được những việc mà người khác tin là không thể!”

Related Articles

String là một kiểu dữ liệu thông dụng trong nhiều ngôn ngữ lập trình, nó mạnh vì nó có thể dùng vào nhiều trường hợp để giải quyết các vấn đề

Nếu bạn muốn người dùng cung cấp tên, tuổi, email… ta cần một hàm Javascript  để đảm bảo rằng họ đã nhập với các thông tin này

The character jumping around the page was caused by having to finish the animation to the next unit before going on to the next key.

Ví dụ sau minh họa một biểu mẫu HTML5 truy cập dữ liệu thông qua lệnh gọi API Ajax bằng cách sử dụng phương thức POST.