2009-08-16 108 views
1

所以我有兩個文件dA和dB分別託管在兩個不同的服務器sA和sB上。如何在iframe中獲取javascript以修改父文檔?

文檔dA有一些JS,它打開一個iframe src'ing文檔dB,並帶有一個表單。當文檔dB中的表單提交給服務器sB上的表單處理程序時,我想要關閉頁面dA上的iframe。

我希望這已經夠清楚了。有沒有辦法做到這一點?

謝謝!

-Mala

UPDATE:我除了通過插入JavaScript的

+0

如果我想修改DA這從下面的答案出現時,JS有來自DA - 這樣一個類似的問題:我能有一個按鈕dA以dB爲單位提交表單? – Mala 2009-08-16 07:52:57

+0

沒有,沒有訪問dA/sA仍然不可能。 – Mark 2009-08-16 08:02:53

回答

0

謝謝大家的回答。我找到了一個解決方案:

在我的服務器上,我告訴表單重定向到創建iframe的url。 在包含iframe的網站上,我添加了一個setInterval函數來輪詢iframe的當前位置。

由於JS沙盒,這個民意調查不工作,而url是外國(即在我的表單提交之前)。但是,一旦url爲本地(即與調用頁面相同),則url可讀,並且該函數關閉iframe。這一旦iframe被重定向,我甚至不需要等待額外的頁面加載。

非常感謝您格雷​​格幫我:)

3

這不應該是可能的,因爲瀏覽器/ JavaScript安全沙箱策略在DA或SA的控制。這就是說,有可能通過一些嘲弄來擺脫這些限制。有各種各樣的方法,有些涉及Flash。

我會建議不要如果可能這樣做,但如果非要我推薦了DNS的方法這裏所說:

http://www.alexpooley.com/2007/08/07/how-to-cross-domain-javascript/

重點摘錄:

Say domain D wants to connect to domain E. In a nutshell, the trick is to use DNS to point a sub-domain of D, D_s, to E’s server. In doing so, D_s takes on the characteristics of E, while also being accessible to D.

0

的機制這樣做可能會發生跨站點腳本攻擊(因爲您可以做的不僅僅是刪除頁面內容)。

一個安全的方法將僅限於iframe文件清空/隱藏本身,但如果包含它的iframe是固定大小,您最終會在頁面上留下一個空白點。

+0

我如何根據框架的內容垂直製作iframe大小?這將解決我的問題,我可以讓iframe顯示一個空白頁面來「刪除」它 – Mala 2009-08-16 07:57:00

0

如果您無法控制dA或Sa,則由於瀏覽器安全限制而無法執行此操作。即使Flash方法也需要訪問這兩個服務器。

2

假設我創建頁面A,該頁面覆蓋整個頁面。 讓一個鏈接到yourbank.com,然後點擊該鏈接。現在,如果我可以使用JavaScript修改框架(銀行網站)的內容,我將能夠很容易地讀取您正在使用的密碼並將其存儲在cookie中,並將其發送到我的服務器等。

這就是您無法修改其他框架中內容不在同一個域中的內容的原因。但是,如果它們來自同一個域,則應該能夠按照您認爲合適的方式進行修改(兩個頁面必須位於您的服務器上)。

你應該能夠使用此代碼訪問的iframe:

window["iframe_name"].document.body 
2

其他人解釋安全隱患。但是這個問題是合法的,有用例,在某些情況下可以做你想做的事情。

W3C定義了一個名爲domaindocument屬性,該屬性用於檢查安全權限。這個屬性可以由兩個文檔共同操縱,所以它們可以在某些情況下訪問對方。

治理文件是DOM Level 1 Spec。看看the description of document。正如你可以看到這個屬性在這裏定義的,…它是隻讀的。實際上所有的瀏覽器都允許修改它:

修改不能是任意的。通常只允許超級域名。這意味着您可以讓不同服務器提供的兩個文檔互相訪問,只要它們具有公共的超級域。

所以如果你想要兩個頁面進行通信,你需要添加一個小的單行,這應該在頁面加載運行。類似的東西應該做的伎倆:

document.domain = "yourdomain.com"; 

現在你可以從不同的子域爲他們提供服務,而不會丟失他們的可訪問性。

顯然你應該注意時機問題。如果您建立某種通知協議,則可以避免它們。例如,一個頁面(主)設置其域,並加載另一個頁面(服務器)。服務器運行時,它會更改其域並訪問觸發某個功能的主服務器。

+0

只是不可思議。我從來沒有聽說過這種技術。使用Chrome和Safari,您甚至可以將簡單的頂級域名傳遞給設置者... – user123444555621 2010-08-30 18:04:09

+0

我知道這是舊的,但爲了將來的參考,Chrome看起來已經阻止了這一點。現在它返回:'未捕獲錯誤:SECURITY_ERR:DOM異常18'。 – 2012-10-19 15:26:25

3

如果你只是想頂層關閉,你可以調用像這樣:

window.top.location = "http://www.example.com/dC.html"; 

這將收出大和發送用戶dC.html代替。 dC.html可以在onload處理程序中擁有要運行的JS(例如,關閉窗口)。

0

這是一個有點令人費解,但可能會比直XSS解決方案更合理:

你有超過服務器比編寫JavaScript以文件答:其他無法控制的,但您打開一個文檔內的iframe中,建議您只能對文檔A進行寫入訪問。這有點令人困惑。你是寫j文件到A文件還是以某種方式注入文件?

無論哪種方式,這都是我夢寐以求的。如果您無法訪問託管擁有iframe的頁面的服務器,它將不起作用。

用戶在iframe中的表單上點擊提交。表單一旦完成,很可能會改變託管該表單的服務器上的某些內容。所以你在文檔A上有一個AJAX函數,它要求服務器端腳本檢查表單是否已經提交。如果有,則腳本向AJAX函數返回一個「提交」值,這會觸發另一個js函數關閉iframe。

以上需要幾件事情:

  • iframe的需要是託管服務器上的頁面,在這裏你可以寫一個額外的服務器端腳本(這避免了跨域的問題上,因爲理論上AJAX指向相同的目錄)。

  • iframe中的服務器必須有一些可以被請求的url,這將返回某種形式已被提交的確認。

  • 「check-for-submitted」腳本需要知道上述URL以及加載上述URL時要查找的內容。

如果你有上述所有的,ajax的函數調用服務器腳本,服務器腳本使用捲曲去,如果形式完成,反映了URL,服務器腳本將查找「表單已經提交「指標,並且根據它發現的結果,返回」未提交「或」提交「到ajax函數的答案。

例如,表單可能是用於用戶註冊的。如果您的外部文檔知道將在表單中輸入的用戶名,則服務器端腳本可以轉至http://example.org/username,如果出現「用戶未找到」,則表明您的表單尚未提交。

任何超出上述例子中的可能性的東西都可能在安全和無害之外。儘管在用戶提交iframe時自動關閉iframe會非常方便,但請考慮我向您發送了一封表明您的銀行帳戶需要查看的電子郵件的可能性。該電子郵件有一個鏈接到我已經做了一個頁面的鏈接,您的銀行網站的iframe將填充整個頁面的可見部分。您正常登錄,因爲您非常信任。如果我有權訪問您在頁面上提交的事實,那意味着我也可以訪問您提交的內容,或者至少可以訪問iframe重定向到的URL(其中可能具有會話ID或各種類型的其他銀行不應包含在網址中的數據)。

我的意思並不是要說話。你應該考慮爲了瞭解一個事件,你經常可以訪問你不應該擁有的其他數據。

我認爲一個稍微不太好的解決方案就是在iframe上面有一個鏈接,當用戶完成了表單的操作後,iframe會顯示「完成」或「關閉」以殺死iframe。這不僅會在用戶提交表單時關閉iframe,還會讓他們有機會說「哎呀!我不想填寫這個表單,無論如何。現在使用您想要的自動解決方案,除非用戶點擊提交,否則無法擺脫iframe。

相關問題