2012-11-09 84 views
1

我有一個域的頁面:調用父窗口方法

http://main.mydomain.com/frame.cfm保持的iframe, 加載域http://www.anotherdomain.com

在該頁面http://www.anotherdomain.com具有腳本引用http://sub.mydomain.com/somescript.js

這somescript是像谷歌分析,其與www.anotherdomain.com的每個請求加載跟蹤腳本。

在某一個階段,在頁面www.anotherdomain.com腳本http://sub.mydomain.com/somescript.js會嘗試調用window.top.aFunction(); or parent.aFunction();

使父窗口做一些事情。

我知道關於X-Frame-Options和Access-Control-Allow-Origin頭文件,並嘗試了兩種方法,但仍然在www.anotherdomain.com上的iframe中瀏覽時,我在Firebug中收到一條錯誤消息,告訴我:

Error: Permission denied to access property 'relocate'window.top.aFunction(); 

在我的main.domain網站的web.config我有以下規則:

<httpProtocol> 
    <customHeaders> 
    <add name="Access-Control-Allow-Origin" value="http://sub.mydomain.com" /> 
     <add name="X-Frame-Options" value="ALLOW-FROM http://sub.mydomain.com" /> 
    </customHeaders> 
</httpProtocol> 

這在我看來應該授予對主腳本的sub.mydomain.com訪問.mydomain.com來。

我正在測試這與所有的域名,除了www.anotherdomain.com本地在我的電腦主機參考到位。

任何想法我在這裏失蹤?

回答

2

您無法通過跨域iFrame訪問父窗口函數的方法。它違背了Same Origin PolicyX-Frame http標題響應告訴瀏覽器是否允許在iFrame中呈現頁面並且不利於您的情況。

我推薦的解決方案是使用window.postMessage()在兩個幀之間進行通信。看看http://ejohn.org/blog/cross-window-messaging/

+0

嗯,好吧。看起來有點像工作,是嗎? Internet Explorer似乎不支持它。我確實需要支持IE7 +。關於同一起源策略:我覺得很煩人,我的腳本頁面和框架頁面在同一個主域中。我認爲這應該足夠安全嗎?我也可以將腳本放在main.mydomain.com域中,但是我有一個運行在那裏的框架,可以捕獲我的單獨腳本請求,並且需要一些代碼來忽略框架上下文中的腳本。不是很優雅 – Mattijs

+0

http://easyxdm.net/wp/嘗試使用,加入ie7,6支持 – ama2

+0

謝謝!我還注意到,我被允許通過iframe中的腳本將parent.location設置爲其他內容。在父級中調用函數與直接設置函數相同,安全性明顯不同。有點奇怪。另外,如果他們不那麼嚴格,如果他們不願意看到子域名,而是在域名上,那就太好了。我目前的觀點應該足夠安全。 – Mattijs