2012-02-06 100 views
4

我想爲我的web應用程序使用內容網站保護。如果您還沒有聽說過它,簡而言之:它將允許我禁用任何嵌入式JavaScript到我的Web應用程序中,從而幫助阻止XSS。Javascript和CSP - 最佳實踐

結果是,我所有的javascript代碼都必須在外部文件中。

大多數JavaScript'庫/框架'代碼已經存在,但通常我的頁面至少包含幾行JS代碼,實例化與特定頁面相關的組件。

例如,我有一個假設的註冊頁面。在註冊頁面的底部,我有以下代碼:

var registrationForm = new MyApp.registrationValidator($('.regform')); 
registrationForm.init(); 

這個假設代碼獲取登記表格的引用,可以註冊所有的驗證代碼。

現在我必須將此代碼移動到外部文件。我可以:

選項A:爲每個頁面創建一個小的.js文件,該文件只執行該頁面特定的代碼。

  • 優點 - 簡單較快
  • 缺點 - 每一頁這一個額外的js文件,我更喜歡能夠爲我所有的JavaScript減少到一個單一的文件,以減少請求。

選項B:在JavaScript文件中執行我所有的'實例化代碼'。我只會檢測頁面上是否有'.regForm'css類,並且只有在頁面上出現對象時纔會實例化對象。

  • 優點 - 用於實例化的單個位置。如果頁面上的組件具有正確的css類,它將奇蹟般地開始工作。
  • 缺點 - 如果我的應用程序增長很多,將會有很多初始化代碼可能不需要用於特定頁面。

選項C:給我<body>標籤的ID或類,並執行基於一個大的交換機上的正確的代碼。

  • 優點:仍然可以壓縮爲一個.js文件,而且我不需要每頁.js文件。
  • 缺點:我想我覺得這有點難看。

總之,選項B是最好的,如果它不是因爲我覺得有一大堆初始化代碼是個壞主意。

我主要想知道的是,你有這種情況的經歷,你是如何解決它的?

回答

3

選項D(A和B的變體):查看將多個javascript源文件編譯(並縮小)爲一個的部署系統,僅考慮該頁面所需的文件。

對於PHP,Assetic就是這樣一個系統。

+0

謝謝!這是一個很好的建議,也是一個很好的解決問題的項目。儘管我覺得我最終能夠給用戶一個大的js包,而不是爲大多數頁面提供新的下載。 – Evert 2012-02-07 11:04:21

1

如果你願意使用像jQuery這樣的框架(動態加載和執行外部javascript),你可以將A和B的優點結合起來。每個頁面都會加載相同的.js,它決定(通過存在或不存在dom元素)動態加載哪些其他.js文件。

+0

我們使用jQuery以及主幹。我試圖在選項B中暗示這一點,但是感謝你做了一個更好的工作來描述我的意思:) – Evert 2012-02-06 12:47:37

+0

如果你想擺脫客戶端的初始化代碼,你可以讓php/asp/jsp確定哪個.js附加到html輸出。對於PHP我確信,你可以做DOM XML遍歷。 – maddrag0n 2012-02-06 12:52:23