2012-05-10 49 views
24

我問這個問題,因爲我們將開發一個應該通過JavaScript共享跨源數據的應用程序。一種可能的解決方案似乎是JSONP,因爲它使用SCRIPT標籤從其他域中獲取數據。然而,我想避免我們假設SCRIPT標籤不受sop限制並且在某些時候瀏覽器禁止此功能的情況下實現我們的真棒代碼的情況。爲什麼HTML SCRIPT標籤不受同源策略

任何人都可以闡明什麼是腳本標籤允許跨域請求的原因,一些光?

+0

出於同樣的原因,標籤不受其影響。 – Corbin

+0

這是什麼原因,它是如何適用於(可執行的)腳本? – moritz

+6

從某種意義上說,相同的出處政策實際上是爲什麼腳本標記到其他域是安全的。你不會在你的標記中不小心加入腳本標記(希望不是),但是如果你不控制它,你不能保證你所包含的代碼的安全性。您可能希望包含一些JS,以便您的網頁上可以放置廣告,但您不希望該廣告網站能夠訪問用戶的會話Cookie。 – Corbin

回答

2

這是同樣的原因,你可以使用(不,在獲得該文件的內容)的腳本,樣式,和其他領域託管的圖像。


我讀the spec regerding scripts,它沒有說明爲什麼。它說的是:

如果src具有URI值,用戶代理必須忽略元素的內容並通過URI檢索腳本。

檢索[和執行]

+0

樣式和圖像本身並不危險,此外:任何Ajax請求都不允許進行跨域請求,爲什麼要對腳本標記進行豁免?你是否認爲這是出於歷史原因? – moritz

+3

@mosch [圖片也可能是危險的](http://seclists.org/isn/2004/Sep/88) –

+0

樣式和圖片*受制於同一來源政策。對於不同來源的資源,CSSStyleSheet的'.cssRules'屬性(例如'document.styleSheets [0]')是空的。如果來自另一個域的圖像不能在畫布上操作 –

3

我想this draft題爲「同源策略的原理」解釋(儘管是短暫的)什麼是幾乎在每個人的頭上:

原則,用戶代理可以將每個URL作爲單獨的委託人對待,並將每個文檔與每個其他URL隔離開來,除非文檔明確指出它信任該URL。不幸的是,這種設計對於開發人員來說很麻煩,因爲Web應用程序通常由許多一致行動的資源組成。

作爲近似,用戶代理組的URL一起成稱爲起源保護域。特別是,如果兩個URL具有相同的方案,主機和端口,則它們是同一來源的一部分(即代表相同的主體)。

簡而言之:如果所有東西都受到SOP的限制,構建Web將會更加困難。

+0

感謝洞察力的回答,這也是GGG的鏈接似乎暗示了(關於圖像),但我沒有看到的是爲什麼我有一個相同的起源策略,當有簡單的方法來繞過它?我可以肯定的是,在五年內,瀏覽器仍然使JSONP成爲可能嗎? – moritz

+0

@mosch:JSONP要求客戶端和服務器明確協作,並且客戶端完全信任服務器;我不會稱這是一種簡單的方法。它的工作原理是客戶端和服務器之間的一個「協議」,用戶代理一無所知,就像問「我怎麼能確定瀏覽器在五年後仍然不會拒絕從包含'foo'的URL加載樣式表」。 – Jon

-1

原因是因爲遺留問題。它是多年前建造的,如果它現在發生變化,太多的網站將會失敗。此外,安全影響是衆所周知的,因爲它已經存在了很長時間。