2016-08-03 126 views
1

我們有一個應用程序位於防火牆之後,位於CAS認證層之後。它具有一項功能,允許具有特殊角色的用戶通過編寫在運行時插入到應用程序中的JavaScript函數來定製應用程序的工作方式,並且可以通過按鈕點擊和頁面加載等事件觸發該功能。 (JS不是「eval」d)它被寫入頁面服務器端。)如何保護允許用戶插入JavaScript的應用程序?

不用說,這個特性引發了安全問題!

除了a)防火牆,b)健壯身份驗證和c)授權外,是否還有其他建議可以解決這個問題。

編輯: 迴應評論中的問題: 1.注入的代碼是否成爲應用程序的一部分,還是作爲獨立的應用程序(分離的上下文)執行? 是的,它成爲應用程序的一部分。它目前被插入到服務器端,插入到腳本標籤中。

  1. 插入的JavaScript是否在客戶端瀏覽器上運行,而不是原作者? 是的。它會持續存在,然後插入到所有將來的請求中。

(應用程序可以被認爲是一個「引擎」用於創建自定義應用程序針對該通過REST風格的調用訪問一個通用的後端數據存儲。每個自定義應用程序可以有它自己的一套定製的這些Java腳本)

+0

注入的代碼是否成爲應用程序的一部分,還是作爲獨立的應用程序(分離的上下文)執行? – FDavidov

+0

插入的JavaScript是否在客戶瀏覽器上運行,而不是原作者? –

回答

3

你真的不應該只接受任意的JavaScript。理想情況下,應該發生的是,您標記JavaScript發送的任何內容,並確保每個標記都是有效的JavaScript,首要的(這應該適用於所有以下情況)。

之後,您應該驗證是否發送了JavaScript不會訪問敏感信息。

半句可能是非常困難甚至是不可能的混淆代碼來驗證,你可能需要考慮,不管你有多少驗證做,這是一個本身就是不安全的做法。只要你明白,下面是使這一過程更加安全一點的一些建議得比通常是:

  • @FDavidov has mentioned,你也可以從運行的應用程序的一部分,沙箱是在限制的JavaScript一個獨立的上下文很像Stack Snippets。

  • 另一種選擇是將JavaScript限制爲預定義的函數白名單(其中一些可能已經實現)和全局變量。不要讓它直接與DOM或全局進行交互,除非是基元,控制流和用戶定義的函數定義。這種方法取得了一些成功,取決於白名單強大的執行力度。 Here is an example that uses this method in combination with the method below。或者,如果您可以考慮到這一點,請不要讓代碼在代碼的原始作者以外的任何人的機器上運行。這基本上是將類似Userscript的功能轉移到應用程序本身(我真的不明白這一點),但它肯定比讓它在任何客戶端瀏覽器上運行更安全。

+0

謝謝帕特里克。我正在繼承應用程序。我們已經談到了其中的一些方法,儘管很多腳本已經寫好了,而且他們所做的所有事情都應該避免!然而,您的迴應對繪製未來課程會非常有幫助,所以謝謝! – blogofsongs

+0

@blogofsongs沒問題。看起來,根據您的編輯,第二個重點將對您的特定情況最有幫助。確保您的白名單不包含像Object和String這樣的東西,因爲允許自定義JavaScript修改這些構造函數的行爲很可能會導致您的白名單無法執行。你也可能會提到你的團隊,在加載自定義JavaScript之前修改全局變量是不可配置的,這可能是以犧牲性能爲代價的,也可能不是很全面。 –

相關問題