最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

iframe實(shí)現(xiàn)與父頁(yè)面跨域隔離的JavaScript?代碼沙箱

 更新時(shí)間:2023年05月16日 10:59:54   作者:知名噴子  
這篇文章主要介紹了使用iframe實(shí)現(xiàn)與父頁(yè)面跨域隔離的JavaScript代碼沙箱,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

正文

假如讓你實(shí)現(xiàn)一個(gè)在線的 JavaScript 代碼運(yùn)行環(huán)境,要求用戶代碼不能對(duì)頁(yè)面進(jìn)行修改,以避免潛在的安全問題,你會(huì)怎么做?

使用 with?使用 proxy?OK ,都可以,但是這兩種方法都需要關(guān)注很多細(xì)節(jié),否則用戶依舊有可乘之機(jī),這樣一來你的實(shí)現(xiàn)里面就會(huì)有一個(gè)很長(zhǎng)長(zhǎng)長(zhǎng)長(zhǎng)長(zhǎng)長(zhǎng)長(zhǎng)的操作黑名單。

除此之外,我們還可以專門部署一個(gè)頁(yè)面,將代碼提到服務(wù)端渲染成頁(yè)面,再通過 iframe 去訪問,如果 iframe 與父頁(yè)面之間是跨域的話可以達(dá)到很高的安全性——那么能不能不看后端的臉色,完全使用瀏覽器來實(shí)現(xiàn)類似的沙箱呢?

當(dāng)然可以——

1. iframe

對(duì)前端頁(yè)面而言,跨域是頁(yè)面與頁(yè)面之間的鴻溝,但這并不意味著我們必須重新打開一個(gè)頁(yè)面來運(yùn)行新的代碼,因?yàn)槲覀兛梢允褂?nbsp;<iframe> 標(biāo)簽:

<iframe src="www.xxxx.xxx"></iframe>

對(duì)于同域的 iframe ,我們可以直接通過 .contentWindow 訪問并操作它的全局對(duì)象,然后直接往里面執(zhí)行 JavaScript:

document.querySelector('iframe')
  .contentWindow
  .eval('alert("hello world!");');

但是同域頁(yè)面的子頁(yè)面是可以與父頁(yè)面進(jìn)行互操作的,

2. data URL

你可能在一些頁(yè)面里見過小圖片不使用網(wǎng)絡(luò)鏈接,而是采用一個(gè) data:image/png;base64 xxxxxxx 風(fēng)格的 URL ,這種 URL 就是 data URL


除了 data URL 之外你可能還見過 blob:// 開頭的 URL —— Object URL。不過 Object URL 與當(dāng)前頁(yè)面是同域的,而 data URL 與當(dāng)前頁(yè)面是跨域的。所以我們可以在 iframe 使用 data URL 來進(jìn)行跨域隔離。

3. 將 JavaScript 代碼變成 data URL

我們可以直接將 JavaScript 片段變成 data:application/javascript, 的 URL ,但是這樣有一個(gè)問題: iframe 打開這樣的 URL 的時(shí)候,會(huì)顯示代碼原文而不是執(zhí)行代碼,這個(gè)行為其實(shí)和你直接在瀏覽器地址欄輸入 JS 的 URL 是一樣的。
所以我們需要將 JavaScript 代碼拼接到 html 里面,再變成 data URL ,然后交給 iframe 去加載:

const javaScriptFragment = `
alert('hello world');
`;
const htmlFragment = `
<!doctype html>
<html>
  <head>
    <meta chatset="utf-8" />
  </head>
  <body>
    <script>${javaScriptFragment}</script>
  </body>
</html>
`;
const dataUrl = `data:text/html,${htmlFragment}`;
// 注意,如果代碼片段中含有中文的話,需要使用 encodeURIFragment 轉(zhuǎn)義 htmlFragment
document.querySelector('iframe').src = dataUrl;

4. 如果需要獲取執(zhí)行結(jié)果的話,基于 postMessage 定制通信機(jī)制

如果我們不但要做沙箱隔離,還被要求獲取運(yùn)行結(jié)果的話,則可以做一個(gè)通信機(jī)制,讓 iframe 獲取到用戶代碼執(zhí)行結(jié)果, iframe 與父頁(yè)面之間最好的跨域通信方法莫過于 postMessage。
除了獲取結(jié)果之外,還可以將通信機(jī)制進(jìn)一步擴(kuò)展成為 RPC ,這樣可以實(shí)時(shí)修改頁(yè)面里的代碼來查看效果,類似于 codepen 。

具體實(shí)現(xiàn)與主題不是強(qiáng)相關(guān),這里就不寫了,更多關(guān)于JavaScript iframe頁(yè)面跨域隔離的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • SyntaxHighlighter語(yǔ)法高亮插件使用說明

    SyntaxHighlighter語(yǔ)法高亮插件使用說明

    SyntaxHighlighter語(yǔ)法高亮插件使用說明,需要的朋友可以參考下。
    2011-08-08
  • js控制TR的顯示隱藏

    js控制TR的顯示隱藏

    在很多現(xiàn)實(shí)的場(chǎng)景中,有的文本框我們希望在選擇“是”的按鈕之后才出現(xiàn),這就需要js控制TR的隱藏和顯示,如何控制,本文為大家揭曉
    2016-03-03
  • Bootstrap table使用方法總結(jié)

    Bootstrap table使用方法總結(jié)

    這篇文章主要總結(jié)介紹了Bootstrap table的使用方法,服務(wù)器分頁(yè)、客戶端分頁(yè)的轉(zhuǎn)換,table刷新,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • iframe里的頁(yè)面禁止右鍵事件的方法

    iframe里的頁(yè)面禁止右鍵事件的方法

    這篇文章主要介紹了iframe里的頁(yè)面禁止右鍵事件的方法,需要的朋友可以參考下
    2014-06-06
  • js 使用ajax設(shè)置和獲取自定義header信息的方法小結(jié)

    js 使用ajax設(shè)置和獲取自定義header信息的方法小結(jié)

    這篇文章主要介紹了js 使用ajax設(shè)置和獲取自定義header信息的方法,結(jié)合實(shí)例形式總結(jié)分析了js 使用ajax自定義設(shè)置和獲取header響應(yīng)信息相關(guān)操作技巧與使用注意事項(xiàng),需要的朋友可以參考下
    2020-03-03
  • ES6如何用一句代碼實(shí)現(xiàn)函數(shù)的柯里化

    ES6如何用一句代碼實(shí)現(xiàn)函數(shù)的柯里化

    這篇文章主要介紹了ES6如何用一句代碼實(shí)現(xiàn)函數(shù)的柯里化,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • 淺析JavaScript對(duì)象轉(zhuǎn)換成原始值

    淺析JavaScript對(duì)象轉(zhuǎn)換成原始值

    這篇文章主要介紹了淺析JavaScript對(duì)象轉(zhuǎn)換成原始值,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下,需要的朋友可以參考一下
    2022-07-07
  • javascript實(shí)現(xiàn)的顏色塊滑動(dòng)的動(dòng)態(tài)效果

    javascript實(shí)現(xiàn)的顏色塊滑動(dòng)的動(dòng)態(tài)效果

    javascript實(shí)現(xiàn)的顏色塊滑動(dòng)的動(dòng)態(tài)效果...
    2007-08-08
  • JavaScript變量中var,let和const的區(qū)別

    JavaScript變量中var,let和const的區(qū)別

    這篇文章主要介紹了JavaScript變量中var,let和const的區(qū)別,JavaScript中一共有3種用來聲明變量的關(guān)鍵字,分別是var、let和const,文章通過圍繞主題展開對(duì)三個(gè)關(guān)鍵詞的詳細(xì)介紹,需要的朋友可以參考一下
    2022-09-09
  • 再談javascript注入 黑客必備!

    再談javascript注入 黑客必備!

    這篇文章主要為大家詳細(xì)介紹了js注入,黑客之路必備!本文告訴大家js注入是什么,js注入攻防如何進(jìn)行,感興趣的小伙伴們可以參考一下
    2016-09-09

最新評(píng)論

蛟河市| 台北市| 崇明县| 怀仁县| 吴川市| 平果县| 奉新县| 邵武市| 三门峡市| 长乐市| 高台县| 保靖县| 通榆县| 寻乌县| 许昌市| 正阳县| 江永县| 鹿泉市| 尉氏县| 犍为县| 南宫市| 韩城市| 靖西县| 丁青县| 象州县| 汝城县| 阿图什市| 衢州市| 台北市| 常宁市| 郸城县| 高清| 静海县| 宁德市| 昂仁县| 泊头市| 东明县| 凤台县| 淮安市| 茌平县| 德庆县|