婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁(yè) > 知識(shí)庫(kù) > 關(guān)于iframe跨域使用postMessage的實(shí)現(xiàn)

關(guān)于iframe跨域使用postMessage的實(shí)現(xiàn)

熱門標(biāo)簽:如何查看地圖標(biāo)注 惡搞電話機(jī)器人 欣鼎電銷機(jī)器人 效果 黃石ai電銷機(jī)器人呼叫中心 高德地圖標(biāo)注商戶怎么標(biāo) ok電銷機(jī)器人 電話機(jī)器人技術(shù) 地圖標(biāo)注軟件打印出來 智能電銷機(jī)器人被禁用了么

當(dāng)我們要在域名A.com下使用一個(gè)域名B.com提供的頁(yè)面服務(wù),直覺想到的實(shí)現(xiàn)方式就是使用iframe。但是iframe直接的交互存在**跨域問題**,目前看來解決方式有兩種。一是使用nginx代理轉(zhuǎn)發(fā),在域名A的nginx上配置指定的轉(zhuǎn)發(fā)規(guī)則,直接指向域名B,直接干掉了跨域;另一種方式是使用postMessage方法。此處針對(duì)第二種方式,看下使用方式和可能的問題。

postMessage是什么

此處引用MDN關(guān)于postMessage的詳細(xì)說明。簡(jiǎn)而言之就是:postMessage是掛載在window下的一個(gè)方法,用于不同域名下的兩個(gè)頁(yè)面的信息交互,父子頁(yè)面通過postMessage()發(fā)送消息,再通過監(jiān)聽message事件接收信息。

postMessage使用

假設(shè)有一個(gè)父頁(yè)面indexPage.html, 子頁(yè)面iframePage.html

一、父頁(yè)面向子頁(yè)面發(fā)送消息

// 父頁(yè)面index.html

//獲取iframe元素

iFrame = document.getElementById('iframe')

//iframe加載完畢后再發(fā)送消息,否則子頁(yè)面接收不到message

iFrame.onload = function(){

//iframe加載完立即發(fā)送一條消息

iFrame.contentWindow.postMessage({msg: 'MessageFromIndexPage'},'\*');

}

iFrame.contentWindow.postMessage('MessageFromIndexPage','b.com')

方法的第一個(gè)參數(shù)是發(fā)送的消息,無格式要求;第二個(gè)參數(shù)是域名限制,當(dāng)不限制域名時(shí)填寫* ,第三個(gè)可選參數(shù)transfer一般不填,這個(gè)參數(shù)有嚴(yán)重的瀏覽器兼容問題。

二、子頁(yè)面接收父頁(yè)面發(fā)送的消息

// 子頁(yè)面iframePage.html

//監(jiān)聽message事件

window.addEventListener("message", function(event){

console.log( '這里是接收到來自父頁(yè)面的消息,消息內(nèi)容在event.data屬性中', event )

}, false)

三、子頁(yè)面給父頁(yè)面?zhèn)鬟f消息

window.parent.postMessage({name: '張三'}, '\*');

方法的第一個(gè)參數(shù)是發(fā)送的消息,目前可無格式要求, 在 Gecko 6.0 (Firefox 6.0 / Thunderbird 6.0 / SeaMonkey 2.3)之前, 參數(shù) message 必須是一個(gè)字符串;第二個(gè)參數(shù)是域名限制,當(dāng)不限制域名時(shí)填寫’*‘

四、父頁(yè)面接收子頁(yè)面的消息

//監(jiān)聽message事件

window.addEventListener("message", function receiveMessageFromIframePage (event) {

console.log('這里是子頁(yè)面發(fā)送來的消息,消息內(nèi)容在event.data屬性中', event)

}, false);

postMessage的安全問題

使用postMessage交互,默認(rèn)就是允許跨域行為,一旦允許跨域,就會(huì)有一些安全問題,針對(duì)postMessage主要有兩種攻擊方式。一是偽造數(shù)據(jù)發(fā)送方(父頁(yè)面),易造成數(shù)據(jù)接收方(子頁(yè)面)受到XSS攻擊或其他安全問題;二是偽造數(shù)據(jù)接收方,類似jsonp劫持。

一、偽造數(shù)據(jù)發(fā)送方

攻擊方式:偽造一個(gè)父頁(yè)面,引導(dǎo)使用者觸發(fā)功能,發(fā)送消息給子頁(yè)面,如果子頁(yè)面將父頁(yè)面發(fā)送的消息直接插入當(dāng)前文檔流,就是引發(fā)XSS攻擊,或者子頁(yè)面使用父頁(yè)面?zhèn)鬟f的消息進(jìn)行其他操作,例如寫入數(shù)據(jù),造成安全問題。

防范方式:子頁(yè)面iframe對(duì)接收到的message信息做域名限制

// 子頁(yè)面iframePage.html

//監(jiān)聽message事件

window.addEventListener("message", function(event){

origin = event.origin || event.originalEvent.origin

if(origin == 'https://A.com'){

console.log( '這里是接收到來自父頁(yè)面的消息,消息內(nèi)容在event.data屬性中', event )

}

}, false)

二、偽造數(shù)據(jù)接收方

攻擊方式:偽造一個(gè)子頁(yè)面,在父頁(yè)面中引入子頁(yè)面,在偽造的頁(yè)面中接收父頁(yè)面發(fā)送的消息,此時(shí)可以獲取用戶的敏感消息。

防范方式:父頁(yè)面對(duì)發(fā)送消息的頁(yè)面做域名限制

// 父頁(yè)面index.html

//獲取iframe元素

iFrame = document.getElementById('iframe')

//iframe加載完畢后再發(fā)送消息,否則子頁(yè)面接收不到message

iFrame.onload = function(){

//iframe加載完立即發(fā)送一條消息

iFrame.contentWindow.postMessage('MessageFromIndexPage','https://B.com');

}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

標(biāo)簽:赤峰 阿壩 綏化 盤錦 聊城 中山 金昌 萍鄉(xiāng)

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《關(guān)于iframe跨域使用postMessage的實(shí)現(xiàn)》,本文關(guān)鍵詞  關(guān)于,iframe,跨域,使用,postMessage,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《關(guān)于iframe跨域使用postMessage的實(shí)現(xiàn)》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于關(guān)于iframe跨域使用postMessage的實(shí)現(xiàn)的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    主站蜘蛛池模板: 安泽县| 湄潭县| 峡江县| 如皋市| 长沙市| 隆尧县| 蓬安县| 富源县| 瑞安市| 榆树市| 康平县| 天柱县| 伊吾县| 海口市| 通州区| 临海市| 荣成市| 得荣县| 惠水县| 湖北省| 平遥县| 邯郸县| 卓资县| 海城市| 庄河市| 沅江市| 沾化县| 延川县| 府谷县| 牡丹江市| 包头市| 三江| 十堰市| 福贡县| 铜川市| 财经| 谢通门县| 扶绥县| 鄂托克前旗| 渝北区| 修武县|