2014-12-07 9 views
0

我剛剛發現,爲了允許跨域AJAX調用,應在SERVER端設置Access-Control-Allow-Origin標頭。這讓我感到沮喪,讓我解釋一下爲什麼:瞭解CORS安全性:服務器的使用允許瀏覽器跨域訪問?

1)典型的用例是客戶想要發出跨域請求。我從來沒有聽說過一個服務器試圖限制來自外部網頁的訪問。哦,我記得'防止圖像盜鏈',這是我託管的一個有趣功能,可以通過發送假'Referrer`表頭輕鬆擊敗。

2)即使服務器想要限制來自其他域的連接,使用HTTP協議的功能也無法做到這一點。我建議使用令牌。

3)當你仍然可以使用jsonp時,阻塞XMLHttpRequests有什麼用處?

你能解釋爲什麼這樣做?

對於那些誰是還在讀書,有一個加分題:

4)你知道一種方法來阻止網頁上的任何跨域請求?想象一下初級Web開發人員在頁面上創建一個登錄表單,該頁面上有廣告或其他腳本可能嗅探密碼?這不是網絡安全的本質嗎?爲什麼有人在談論這個?

+1

我相信交叉來源的ajax調用的責任完全奠定了客戶端而不是服務器。服務器如何知道請求是否跨域?爲什麼頁面可以向邪惡的服務器發出請求,卻無法請求某個人忘記放置'Access-Control-Allow-Origin'頭部的服務器? – Dan 2014-12-07 20:54:41

+0

「即使服務器想要限制來自其他域的連接,使用HTTP協議的功能也無法做到這一點,我建議使用令牌。」如果你可以讓AJAX請求任意的跨域內容,你可以獲得這些令牌。 – 2014-12-07 21:00:14

回答

6

我從來沒有聽說過一個服務器試圖限制來自外部網頁的訪問。

同源策略是瀏覽器而不是服務器施加的限制。

CORS是服務器告訴瀏覽器它可以放鬆其正常的安全性,因爲數據不需要這個級別的保護。


即使服務器要限制從其他域的連接,這是不可能做到這一點使用HTTP協議的能力。

這就是爲什麼HTTP協議不用於此目的。

我建議使用令牌。

使用nonce防止CSRF解決了另一個問題。

這是一個相對昂貴的解決方案,只有在請求的副作用可能有問題時(例如「發表新評論」),而不是將數據傳回到另一個運行的JavaScript現場。

您不能使用它們代替相同原點策略來防止跨源讀取數據,因爲(沒有相同原點策略)攻擊性網站將能夠讀取令牌。


什麼用堵的XMLHttpRequest,而你仍然可以使用JSONP的?

除非服務器使用JSONP提供數據,否則不能使用JSONP。

提供在JSONP數據,並使用CORS授予權限訪問的資源是兩種不同的方式,服務器可以讓瀏覽器訪問通常由同源策略保護的數據。

JSONP是一個黑客攻擊。 CORS後來出現,並且更加靈活(因爲它可以允許訪問任何類型的數據,響應除GET以外的請求方法,並允許添加自定義HTTP頭)。


你能解釋這是爲什麼那麼做?

默認策略是「No Access」,因爲瀏覽器無法知道請求的數據是否是公開的。

考慮這種情況:

Alice在Bob的網站上有一個帳戶。該帳戶受密碼保護,並具有Alice和Bob之間應保密的信息(例如銀行記錄或考試結果)。

Mallory有另一個網站。它使用Ajax嘗試訪問Bob的網站。

沒有同源策略,愛麗絲可能(而在Bob的網站登錄)參觀馬洛裏的網站。如果沒有Alice的知識或許可,Mallory的網站會將JavaScript發送到Alice的瀏覽器,該瀏覽器使用Ajax從Bob網站獲取數據。由於它來自Alice的瀏覽器,因此Alice的所有私人信息都被提供給JavaScript。 JavaScript然後將其發送給Mallory。

這顯然不是一件好事。

相同來源策略可以防止這種情況發生。

如果Bob,作爲運行網站的人,決定該信息不是保密的,可以公開分享,那麼他就可以利用CORS或JSONP提供給其他網站上運行的JavaScript訪問它。


你知道一種方法來阻止網頁上的任何跨域請求。

號的網頁是一個單獨的實體。試圖從其他部分監控它的一部分是愚蠢的事情。

想象一下初級web開發人員在頁面上創建登錄表單,該頁面上有廣告或其他腳本可能會嗅探密碼?這不是網絡安全的本質嗎?爲什麼有人在談論這個?

「小心信任第三方腳本」是沒有得到應有的提及。值得慶幸的是,大多數廣告提供商和CDN託管的圖書館都是由合理可靠的人員提供的。


你知道克服缺少訪問控制允許來源

  • 配置服務器,以便沒有丟失它的問題的簡單方法。
  • 使用JSONP代替
  • 使用未被相同原始策略阻止的代理來取回數據(您不會獲得瀏覽器可能發送的任何憑據,因爲Alice擁有Bob的帳戶)。
+2

「CORS服務器告訴瀏覽器它可以放鬆其正常的安全性,因爲數據不需要這樣的保護水平」 - 這使得所有的東西都放在它的位置上。感謝您的明確解釋 – Dan 2014-12-07 21:20:35

+0

據我瞭解,試圖從馬洛裏的網站向Bob發出請求,使用' Dan 2014-12-07 21:48:30

+1

Yes. There are even limits on how much information gets passed into 'load' and 'error' events when an ''指向另一個來源。 – Quentin 2014-12-07 22:48:55

相關問題