2015-07-10 55 views
15

我們有一個在Facebook上運行的Web應用程序(即運行在不同域的iFrame中)。如果Safari用戶的Cookie和網站數據設置爲默認值「允許來自我訪問的網站」,我們通過localStorage.setItem存儲的數據就像sessionStorage一樣行事,即它在用戶當前會話之外不可用(即在用戶關閉後該選項卡)。如果我們將設置更改爲「始終允許」,就像Chrome,IE等一樣工作正常。Safari localStorage在會話之間不會持久

作爲一項測試,我們嘗試直接瀏覽器到我們的應用程序域(https://ourappname.appspot.com),它工作正常那裏。而且它也應該是一個真正的訪問過的網站,但是當回到Facebook的遊戲時,問題依然存在。

請注意,setItem調用成功,只是getItem不會在後續會話中返回任何內容。 (因此,當用戶爲Private Browsing且setItem調用本身失敗並且出現Quota Exceeded錯誤時,它不會如此)。

我們需要做些什麼來支持Safari,以便我們在Facebook上運行的應用程序可以使用localStorage作爲意圖在哪些數據將在會話之間生存?

+0

奇怪的是,我剛剛在Safari 8.0.7(10600.7.12)中測試了「允許我訪問的網站」。我設置了一個localStorage密鑰,然後關閉瀏覽器(使用⌘+ Q),當我重新打開瀏覽器並使用localStorage.getItem時,它就在那裏。 – daviddoran

+0

@daviddoran謝謝。您是否測試了與頂級網站不同的iFrame中運行的網站?我會編輯我的問題,使其更清楚。 – leontx

回答

3

我還在等待蘋果的回覆,但可以肯定地說我們堅持這種行爲。所以Anubhav的回答是準確的,但我們仍然需要一個解決方案。

因此,爲了解決這個問題,我們在服務器上創建了新的端點以保持/恢復遊戲狀態。我們只在Safari上使用它,對於所有其他瀏覽器,我們仍然在localStorage中保持遊戲狀態。

用戶有輕微的性能損失。而且服務器的成本很低。不是一個性感的解決方案,但現在我們的Facebook畫布應用程序支持Safari。

+0

你有沒有聽過嗎?我也遇到過這個問題。我的場景非常相似(iFrame等)。 –

+2

@WesleyWorkman自發布此答案和我的評論以來沒有新信息。這是我們的解決方法,並且已經投入生產了幾個月,並且工作正常。 – leontx

7

這是一個Safari或一個安全功能的錯誤。

您正在訪問FaceBook,而不是您的網站。您的應用在iframe中,如果它允許您從瀏覽器讀取任何數據,就會違反安全模型。考慮一下競爭對手的網站是否讀取了它確實/沒有設置的數據。這會構成信息泄露。

Safari在這方面做得很好。理想情況下,在「允許從我訪問的網站」模式下,瀏覽器不應讓iframe將數據設置爲localStorage;即使每個域都有自己的存儲沙箱。

讓我感到困擾的是爲什麼他們甚至讓你從iframe中寫入localStorage(在你的「只允許訪問的網站」模式下)?這實際上可能是一個錯誤 - 一個信息欺騙攻擊使得錯誤。

我認爲這是因爲安全性異常從本地存儲丟棄,如果請求不是同方來源。因此,Safari實際上不會拋出錯誤,而是讓它靜靜地失敗(在某些情況下)。這可能是你的setItem調用成功的原因。

在這一點上,根據給定的信息,我懷疑,先生,由於Safari程序員跟着standard致信,所以你不走運。

+0

謝謝你的深思熟慮的答案。看起來,如果用戶直接導航到我們的網站,那麼我們的網站將啓用讀取/寫入localStorage。這部分似乎也可能是一個錯誤?我的主要問題是我們需要做什麼......如果您知道任何解決方法,請告訴我。我認爲大多數Facebook的畫布應用程序必須找到解決這個問題的一些辦法? – leontx