
近弄個(gè)東西,需要用到iframe,但是加載的網(wǎng)頁(yè)中有_blank,不能讓他跳出來(lái)。
如果想讓目的網(wǎng)址的_blank刪除,這是不可能的。
網(wǎng)上找了很多的資料,要么是跨域不能修改.要么就根本牛頭不對(duì)馬嘴
后來(lái),看到了html5里iframe有個(gè)叫sandbox的屬性把 iframe 里的網(wǎng)頁(yè)給關(guān)籠子里的屬性
所以,就來(lái)找找這個(gè)的用法.
<iframe sandbox="allow-same-origin allow-scripts allow-popups allow-forms"
src="http://m.qinglibike.com"
style="border: 0; width:130px; height:20px;"></iframe>
我們?cè)谏厦娴氖纠锌吹搅艘恍┛赡艿纳澈袠?biāo)志,現(xiàn)在讓我們更詳細(xì)地研究一下該屬性的內(nèi)部工作原理。
給定具有空沙盒屬性 ( <iframe sandbox src="..."> </iframe>) 的 iframe,框架文檔將被完全沙盒化,并受到以下限制:
JavaScript 不會(huì)在框架文檔中執(zhí)行。這不僅包括通過(guò)腳本標(biāo)簽顯式加載的 JavaScript,還包括內(nèi)聯(lián)事件處理程序和 javascript: URL。這也意味著將顯示 noscript 標(biāo)簽中包含的內(nèi)容,就像用戶自己禁用了腳本一樣。
加框的文檔被加載到一個(gè)唯一的原點(diǎn),這意味著所有的同源檢查都將失敗;獨(dú)特的起源與其他起源不匹配,甚至它們自己也不匹配。除其他影響外,這意味著文檔無(wú)法訪問(wèn)存儲(chǔ)在任何來(lái)源的 cookie 或任何其他存儲(chǔ)機(jī)制(DOM 存儲(chǔ)、索引數(shù)據(jù)庫(kù)等)中的數(shù)據(jù)。
框架文檔無(wú)法創(chuàng)建新窗口或?qū)υ捒颍ɡ纾ㄟ^(guò)window.open或 target="_blank")。
無(wú)法提交表格。
插件不會(huì)加載。
框架文檔只能導(dǎo)航自己,不能導(dǎo)航其頂級(jí)父級(jí)。設(shè)置window.top.location會(huì)拋出異常,點(diǎn)擊鏈接 target="_top"無(wú)效。
自動(dòng)觸發(fā)的功能(自動(dòng)聚焦的表單元素、自動(dòng)播放視頻等)被阻止。
無(wú)法獲得指針鎖。
框架文檔包含的seamless屬性被忽略。iframes
這是非常嚴(yán)格的,加載到完全沙盒中的文檔iframe 確實(shí)構(gòu)成的風(fēng)險(xiǎn)很小。當(dāng)然,它也沒(méi)有多大價(jià)值:對(duì)于一些靜態(tài)內(nèi)容,您可能可以使用完整的沙盒來(lái)擺脫困境,但大多數(shù)時(shí)候您會(huì)希望稍微放松一下。
除了插件之外,這些限制中的每一個(gè)都可以通過(guò)在沙箱屬性的值中添加一個(gè)標(biāo)志來(lái)解除。沙盒文檔永遠(yuǎn)不能運(yùn)行插件,因?yàn)椴寮俏瓷澈械谋緳C(jī)代碼,但其他一切都是公平的游戲:
allow-forms允許表單提交。
allow-popups允許彈出窗口(window.open()、showModalDialog()、target=”_blank”等)。
allow-pointer-lock允許(驚喜!)指針鎖定。
allow-same-origin允許文件保持其來(lái)源;從中加載的頁(yè)面https://example.com/將保留對(duì)該來(lái)源數(shù)據(jù)的訪問(wèn)權(quán)限。
allow-scripts允許 JavaScript 執(zhí)行,也允許特性自動(dòng)觸發(fā)(因?yàn)橥ㄟ^(guò) JavaScript 實(shí)現(xiàn)它們很簡(jiǎn)單)。
allow-top-navigation允許文檔通過(guò)導(dǎo)航頂級(jí)窗口跳出框架。
考慮到這些,我們可以準(zhǔn)確評(píng)估為什么我們最終會(huì)在上面的 Twitter 示例中使用特定的沙盒標(biāo)志集:
allow-scripts是必需的,因?yàn)榧虞d到框架中的頁(yè)面會(huì)運(yùn)行一些 JavaScript 來(lái)處理用戶交互。
allow-popups是必需的,因?yàn)樵摪粹o會(huì)在新窗口中彈出一個(gè)推文表單。
allow-forms是必需的,因?yàn)橥铺乇韱螒?yīng)該是可提交的。
allow-same-origin是必要的,否則 twitter.com 的 cookie 將無(wú)法訪問(wèn),并且用戶無(wú)法登錄以發(fā)布表單。
需要注意的重要一點(diǎn)是,應(yīng)用于框架的沙盒標(biāo)志也適用于在沙盒中創(chuàng)建的任何窗口或框架。這意味著我們必須添加allow-forms到框架的沙箱中,即使表單只存在于框架彈出的窗口中。
使用該sandbox屬性后,小部件僅獲得它所需的權(quán)限,并且插件、頂部導(dǎo)航和指針鎖定等功能仍然被阻止。我們降低了嵌入小部件的風(fēng)險(xiǎn),沒(méi)有任何不良影響。這對(duì)所有相關(guān)人員來(lái)說(shuō)都是一場(chǎng)勝利。
參考網(wǎng)址:https://www.html5rocks.com/en/tutorials/security/sandboxed-iframes/
您發(fā)布的評(píng)論即表示同意遵守以下條款:
一、不得利用本站危害國(guó)家安全、泄露國(guó)家秘密,不得侵犯國(guó)家、社會(huì)、集體和公民的合法權(quán)益;
二、不得發(fā)布國(guó)家法律、法規(guī)明令禁止的內(nèi)容;互相尊重,對(duì)自己在本站的言論和行為負(fù)責(zé);
三、本站對(duì)您所發(fā)布內(nèi)容擁有處置權(quán)。