2008-12-15 65 views
107

有些網站代碼的IFRAME外殼「突圍」,這意味着如果一個頁面A加載爲IFRAMEP的父頁面內一些JavaScript在A重定向外窗到A如何防止IFRAME的重定向頂級窗口

通常此Javascript看起來是這樣的:

<script type="text/javascript"> 
    if (top.location.href != self.location.href) 
    top.location.href = self.location.href; 
</script> 

我的問題是:由於P父頁面的作者,不是A內頁的作者,我怎麼能防止A從這樣做爆發?

P.S.在我看來,它應該是一個跨站點安全違規,但事實並非如此。

+0

我不認爲你可以做很多...如果你不是框架內容的作者。 – scunliffe 2008-12-15 19:53:41

回答

35

嘗試使用onbeforeunload屬性,該屬性可讓用戶選擇是否要導航離開頁面。

例子:https://developer.mozilla.org/en-US/docs/Web/API/Window.onbeforeunload

在HTML5中,你可以使用沙箱屬性。請參閱下面的Pankrat的答案。 http://www.html5rocks.com/en/tutorials/security/sandboxed-iframes/

+1

iFrames * do *允許跨域通信,但是,使用`postMessage`。這不是安全風險,但有人可能會在看到您的評論時纔會知道此功能存在。 :) – coreyward 2012-02-18 15:19:15

+0

這是寫這個答案時不可能的。謝謝你指出。 – 2012-02-21 16:30:00

+16

代碼示例本來不錯。 – fbmd 2013-02-18 07:23:20

0

通過這樣做,您將能夠控制框架頁面的任何操作,而無法操作。 Same-domain origin policy適用。

+14

我並不是要求控制IFRAME中的內容。我要*防止* IFRAME內部控制我。 – 2008-12-15 20:20:19

2

由於您在iframe中加載的頁面可以使用setInterval執行「breakout」代碼,因此onbeforeunload可能不太實際,因爲它可能會讓用戶感到'您確定要離開嗎?對話框。

還有的iframe安全屬性,它僅適用於IE &歌劇

:(

2

在我來說,我希望用戶訪問內部頁面,以便服務器會看到他們的IP作爲一個遊客如果我使用PHP代理技術,我認爲,內頁會看到我的服務器IP作爲一個遊客,所以它不是很好,我走到這一步,唯一的解決辦法是wilth onbeforeunload 將這個網頁上:。

<script type="text/javascript"> 
    window.onbeforeunload = function() {      
     return "This will end your session"; 
    } 
</script> 

這適用於Firefox和ie,這就是我測試的。 你會發現使用類似evt.return(無論)廢話的東西的版本... ...在Firefox中不起作用。

4

我知道問題已經很長時間了,但這裏是我改進後的版本,它只會在iframe加載時等待500毫秒的後續調用。

<script type="text/javasript"> 
var prevent_bust = false ; 
    var from_loading_204 = false; 
    var frame_loading = false; 
    var prevent_bust_timer = 0; 
    var primer = true; 
    window.onbeforeunload = function(event) { 
     prevent_bust = !from_loading_204 && frame_loading; 
     if(from_loading_204)from_loading_204 = false; 
     if(prevent_bust){ 
      prevent_bust_timer=500; 
     } 
    } 
    function frameLoad(){ 
     if(!primer){ 
      from_loading_204 = true; 
      window.top.location = '/?204'; 
      prevent_bust = false; 
      frame_loading = true; 
      prevent_bust_timer=1000; 
     }else{ 
      primer = false; 
     } 
    } 
    setInterval(function() { 
     if (prevent_bust_timer>0) { 
      if(prevent_bust){ 
       from_loading_204 = true; 
       window.top.location = '/?204'; 
       prevent_bust = false; 
      }else if(prevent_bust_timer == 1){ 
       frame_loading = false; 
       prevent_bust = false; 
       from_loading_204 = false; 
       prevent_bust_timer == 0; 
      } 



     } 
     prevent_bust_timer--; 
     if(prevent_bust_timer==-100) { 
      prevent_bust_timer = 0; 
     } 
    }, 1); 
</script> 

onload="frameLoad()"onreadystatechange="frameLoad();"必須被添加到該幀或iframe。

32

我使用沙箱= 「...」

  • 允許表單允許表單提交
  • 允許,彈出窗口允許彈出窗口
  • 允許指針鎖定允許指針鎖定
  • 允許同一原點允許文檔以保持它的起源
  • 允許的腳本允許JavaScript執行,並且還允許特徵來觸發自動
  • 允許機頂導航允許文檔通過導航頂層窗口
打出來的幀的

頂部的導航是你想要防止的,所以留下來,它不會被允許。任何遺漏將被阻止

ex。

 <iframe sandbox="allow-same-origin allow-scripts allow-popups allow-forms" src="http://www.example.com"</iframe>