2014-01-19 32 views
2

我對某些項目使用knitrBootstrap,我開始學習JQuery(Javascript)和CSS以對生成的頁面進行一些修改。我也明白,通常CSS文件和腳本被放置在單獨的文件中並從相同的域(或本地)加載到HTML文檔,但是當我閱讀這兩個庫的文檔時,我發現它們可以從CDN加載提供者,並且從knitrBootstrap生成的HTML文件也可以做到這一點。內容分發網絡(CDN):加載CSS或Javascript庫

例如爲:http://rawgithub.com/jimhester/knitrBootstrap/master/vignettes/illusions.html(18-24行)

<!-- jQuery --> 
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script> 
<script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.10.3/jquery-ui.min.js"></script> 

<!-- bootstrap --> 
<link href=https://netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css rel="stylesheet"> 
<script src="https://netdna.bootstrapcdn.com/bootstrap/3.0.0/js/bootstrap.min.js"></script> 

這似乎很不錯,因爲它允許託管時,從第三方供應商和零部件資源,自己的服務器上加載靜態資源。不過,我也對安全性有些擔憂(不完全是爲了我的目的,而是針對使用此類網頁的網頁),因此對它進行了搜索。我發現了同源策略的概念,並且從我的理解中,JQuery提供的函數不應該被允許改變頁面本身的DOM對象,但是這樣做。

爲什麼JQuery代碼和Bootstrap CSS允許更改剩餘的文檔,即使它們不是從相同的域加載而是從另一個域加載的(在本例中爲CDN)?

回答

1

儘管沒有理由更換,更加關注的文件停止CDN,沒有什麼來自惡意替換這些文件,而CDN意識到這一點,但任何未知的安全措施,阻止別人其他到位有。

社區通常願意忽略該潛在標誌的原因是因爲CDN的巨大收益:所有用戶都能夠對給定文件使用完全相同的CDN的能力。例如,假設每個主要站點都使用CloudFlare CDN鏈接來實現JQuery。這意味着,作爲用戶,當您訪問另一個也使用它的主要站點時,您可以通過使用該文件的可能緩存副本來節省自己的帶寬。這當然帶來了另一個重點:網站不會浪費任何帶寬來提供文件或處理它的請求。

但是,到了你的問題,相同的來源政策不適用於加載腳本或CSS;它適用於頁腳請求(請參閱:ajax)by您的腳本爲了儘量避免跨站點腳本(XSS)。這裏的意圖是,作爲網站創建者,您應該控制哪些腳本會被加載,但是您的頁內請求可能很容易被製作成跨站請求,從而可能暴露不應該暴露的數據(例如會話變量)。關鍵在於,當瀏覽器向CDN提出請求時,它不會將該會話變量或任何其他不應該得到的cookie(您的域)的CDN提供給該CDN。但是,一旦該腳本能夠執行,確實可以訪問您的域的Cookie,並且可以將這些轉發到任何其他沒有相同來源策略的站點上。

與Javascript不同,CSS實際上並不直接執行代碼,而是指定了一大堆在您的頁面上具有視覺效果的屬性(這會導致瀏覽器執行代碼以使其發生,包括潛在地下載由CSS)。

+0

感謝您對此解釋pickypg – user3212577

+0

因此,一旦加載了可能受到攻擊的腳本,它可以查詢所有cookie和會話變量,並通過帶有參數的簡單GET將其發送給第三方服務器?另外爲什麼ajax會被同源策略阻塞?它的核心只是一個GET到任何遠程服務器?最後一個問題:我似乎無法找到關於這個特定主題的更多文獻(帶有CDN鏈接的JS)。你有一些暗示嗎?非常感謝您的幫助:) – user3212577

+0

是的,受損腳本可以輕鬆地將您的cookies(通常是您的會話信息作爲結果)發佈到第三方服務器,但不一定只是通過查詢字符串。 Ajax不限於發出'GET'請求。它可以使用'GET','POST','PUT','DELETE'等。它被阻止以防止這種確切的情況發生 - 很不幸,這很容易解決;請參閱[JSONP](http ://en.wikipedia.org/wiki/JSONP#Script_element_injection))。關於JavaScript和CDN並無太多可說的地方;您可以下載它,或者不要,無論CDN如何。 – pickypg