欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

正文

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

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

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

當(dāng)然可以——

1. iframe

對前端頁面而言,跨域是頁面與頁面之間的鴻溝,但這并不意味著我們必須重新打開一個頁面來運行新的代碼,因為我們可以使用 <iframe> 標簽:

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

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

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

但是同域頁面的子頁面是可以與父頁面進行互操作的,

2. data URL

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


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

3. 將 JavaScript 代碼變成 data URL

我們可以直接將 JavaScript 片段變成 data:application/javascript, 的 URL ,但是這樣有一個問題: iframe 打開這樣的 URL 的時候,會顯示代碼原文而不是執(zhí)行代碼,這個行為其實和你直接在瀏覽器地址欄輸入 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 定制通信機制

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

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

相關(guān)文章

  • document.compatMode的CSS1compat使用介紹

    document.compatMode的CSS1compat使用介紹

    這篇文章主要介紹了document.compatMode的CSS1compat使用,需要的朋友可以參考下
    2014-04-04
  • 微信小程序頁面間傳值的實現(xiàn)方法示例

    微信小程序頁面間傳值的實現(xiàn)方法示例

    這篇文章主要給大家介紹了關(guān)于微信小程序頁面間傳值的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • 淺談javascript函數(shù)式編程

    淺談javascript函數(shù)式編程

    你是否知道JavaScript其實也是一個函數(shù)式編程語言呢?本文將教你如何利用JavaScript的函數(shù)式特性。
    2015-09-09
  • js實現(xiàn)上下左右彈框劃出效果

    js實現(xiàn)上下左右彈框劃出效果

    本文主要介紹js實現(xiàn)上下左右彈框劃出效果的實例,具有很好的參考價值。下面跟著小編一起來看下吧
    2017-03-03
  • 淺談js的ajax的異步和同步請求的問題

    淺談js的ajax的異步和同步請求的問題

    下面小編就為大家?guī)硪黄獪\談js的ajax的異步和同步請求的問題。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-10-10
  • 詳解webpack中的hash、chunkhash、contenthash區(qū)別

    詳解webpack中的hash、chunkhash、contenthash區(qū)別

    這篇文章主要介紹了詳解webpack中的hash、chunkhash、contenthash區(qū)別,詳細的介紹了hash、chunkhash、contenthash的用法和區(qū)別,有興趣的可以了解一下
    2018-01-01
  • 基于BootStrap Metronic開發(fā)框架經(jīng)驗小結(jié)【七】數(shù)據(jù)的導(dǎo)入、導(dǎo)出及附件的查看處理

    基于BootStrap Metronic開發(fā)框架經(jīng)驗小結(jié)【七】數(shù)據(jù)的導(dǎo)入、導(dǎo)出及附件的查看處理

    在很多系統(tǒng)模塊里面,我們可能都需要進行一定的數(shù)據(jù)交換處理,這樣可以很好的達到用戶操作體驗感,接下來通過本文給大家介紹基于BootStrap Metronic開發(fā)框架經(jīng)驗小結(jié)【七】數(shù)據(jù)的導(dǎo)入、導(dǎo)出及附件的查看處理相關(guān)知識,非常具有參考價值,感興趣的朋友一起學(xué)習(xí)吧
    2016-05-05
  • JavaScript 實現(xiàn)同時選取多個時間段的方法

    JavaScript 實現(xiàn)同時選取多個時間段的方法

    這篇文章主要介紹了JavaScript 實現(xiàn)同時選取多個時間段的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • codeMirror插件使用講解

    codeMirror插件使用講解

    codeMirror是一款十分強大的代碼編輯插件,提供了十分豐富的API,最近在項目中用到了這款插件,于是在這里給大家分享下使用方法和心得。具有一定的參考價值,下面跟著小編一起來看下吧
    2017-01-01
  • 使用Js讓Html中特殊字符不被轉(zhuǎn)義

    使用Js讓Html中特殊字符不被轉(zhuǎn)義

    怎么讓<textarea></textarea>之間包含的文本原封不動的顯示出來呢?下面小編就為大家介紹一下具體的實現(xiàn)方法吧
    2013-11-11

最新評論