你了解postMessage嗎?

2021-10-07 14:47:52 字數 1527 閱讀 3418

前言:

通常,對於兩個不同頁面的指令碼,只有當執行它們的頁面位於同源(同協議、同主機、同埠)情況下,這兩個指令碼才能相互通訊。window.postmessage()方法可以安全地實現跨域通訊(前提:正確使用)。

使用:

語法:

otherwindow.postmessage(message, targeorigin, [opt]);
字段解釋:

(1)otherwindow:其他視窗的乙個引用,比如執行window.open返回的視窗物件;

(2)message:將要傳送到其他window的訊息,它將被結構化轉殖演算法序列化。

(3)targetorigin:目標window所在的源。通過視窗的origin屬性來指定哪些視窗能接收到訊息事件,其值可以是字串"*"或者乙個uri。

注意:在傳送訊息的時候,如果目標視窗的協議、主機或埠三者的任意一項不匹配targetorigin提供的值,那麼訊息就不會被傳送;只有當三者完全匹配,訊息才會被傳送。*如果你明確地知道想要傳送到哪個視窗,那麼請始終提供乙個有確切值的targerorigin,而不是 ,不提供確切目標將導致資料洩露到任何對資料感興趣的惡意**。

舉例:

// 傳送方 a頁面

let mywindow = window.

open()

; mywindow.

postmessage

('hello world!'

,'');

// 接收方 b頁面

window.

addeventlistener

('message'

,function

(event)

`,event.origin);}

,false

);

event的四大屬性:

(1)type:指的是傳送訊息的型別;

(2)data:指的是從其他視窗傳送過來的訊息物件;

(3)source:指的是傳送訊息的視窗物件;

(4)origin:指的是傳送訊息的視窗所在的源。

安全問題:

(1)如果不希望從其他**接收message,請不要為message事件新增任何事件偵聽器。

(2)如果確實希望從其他**接收message,請始終使用origin和source屬性驗證傳送方的身份

任何視窗都可以向其他視窗傳送訊息,並且不能保證的是傳送方不會傳送惡意訊息。但是驗證身份後,我們仍然應該始終驗證接收到的訊息的語法。這是乙個萬無一失的方式來避免安全問題,防止不可信任的**利用安全漏洞對您的**進行跨站點指令碼攻擊。

(3)當使用postmessage將資料傳送到其他視窗時,應該始終指定明確的目標origin,而不是*。惡意**可以在您不知情的情況下更改視窗的位置,因此它可以用來攔截使用postmessage傳送的資料。

普通感冒你了解嗎

又到了忽冷忽熱愛感冒的季節。感冒對於每乙個人來說都不陌生,確實這是一種常見的不能再常見的疾病了。不過如果你花上時間好好算算,在人的一生中,可能加起來會有5年的時間都在忍受鼻塞 咳嗽 頭疼 咽痛等感冒所帶來的症狀困擾,可能還有將近1年的時間因為感冒臥病在床。感冒英文中常用 cold 一詞,可是感冒和寒...

你真的了解Java嗎?

三目運算子規則 如果第二個和第三個運算元具有相同的型別,那麼它就是條件表示式的類 型。換句話說,你可以通過繞過混合型別的計算來避免 煩。如果乙個運算元的型別是 t,t 表示 byte short 或 char,而另乙個運算元是乙個 int 型別的常量表示式,它的值是可以用型別 t 表示的,那麼條件表...

2 你了解DevOps嗎?

devops起源於亞馬遜和google,這些公司需要員工緊密協作,同時又不希望出現部門割據開發者一心在創新,讓事情看上去更酷 運維人員更關心 執行的平穩敏捷開發意味著,更早更頻繁的發布產品,先把東西做出來,而不是考慮產品是否完美,30天把原型快速做出來,然後看看人民到底怎麼想,敏捷的意思是快速改變的...