2012-04-27 127 views
5

我提前爲我的問題的一般性質道歉,但我無法找到的人試圖做同樣的事情,我在網絡上的任何有用的建議。讓我來描述一下我的情況:ASP.NET MVC 3 Razor視圖限制

我提供最終用戶/網站的設計師通過存儲在數據庫中的視圖(用剃刀),以定製自己的意見的能力。我有這一切的工作,但我的問題是以下;從安全的角度來看,我如何確保並強制執行不需要的代碼不會在用戶定義的視圖中執行?我認爲有兩種基本方法將在概念上起作用,但我不確定哪一種方法更可行或可行。

選項1:在管理工具中創建一個允許用戶輸入視圖代碼的驗證方法。這需要採取白名單或黑名單的辦法,以允許或不允許。

選項2:從能夠視圖的渲染時發生執行防止不希望的代碼。

由於東西需要被封鎖一個簡單的例子,我們不希望允許訪問在web.config中讀或寫文件,訪問任何數據訪問功能,甚至訪問配置設置等。 。可能會有一些可能不應該允許的大小適中的列表,但我需要坐下來儘量考慮與安全相關的問題。

我的問題是,哪種方法是最好的選擇?另外,可以提供關於如何去做的任何方向?我認爲我可能能夠做出基於信任級別的變更,這將成爲選項2,但無法找到任何方式在基於每個視圖的莊園中進行這項工作(管理代碼被允許執行任何想要的操作)。我認爲選項1最終會是最好的選擇,我將不得不檢查某些不應允許的框架功能的輸入。有沒有人有任何經驗做我想做的事情?任何反饋非常感謝!

+0

選項2將是從用戶的角度來看,誰可能會嘗試使用代碼,他或她,否則不知道的是「壞」的可怕。我同意SLak的白名單方法會更好,我不知道你的項目的確切性質,比如誰是你的消費者,但這將是一項艱鉅的任務,這取決於你需要給他們多少靈活性。 – AwDogsGo2Heaven 2012-04-27 14:27:34

+0

我打算建議你查看Liquid標記,然後找到[DotLiquid](http://dotliquidmarkup.org/try-online)。它看起來像涵蓋了你想要完成的事情(但是使用Liquid而不是Razor)。 – 2012-04-27 14:29:02

回答

1

這將是非常困難的。

您可以通過Razor預處理器運行模板,然後使用Roslyn(仍處於早期測試階段)來解析生成的文件,並查看所有方法調用(或構造函數),並在調用某些東西時返回錯誤,喜歡。
我強烈建議您爲此使用白名單,因爲.Net框架足夠大,您必定會忽略黑名單中的某些內容。


但是,我反而建議你根本不使用剃刀,而是使用一個模板引擎不允許真正的C#代碼。

+0

我原本的DID從一個自定義的模板引擎開始,但似乎有許多優勢堅持使用Razor視圖引擎。即常見視圖編程任務的內置能力,如條件,循環以及它提供對模型的訪問。此外,似乎內置緩存機制將節省大量資源,而不必爲自定義模板系統實現更多的自定義內容。我能找到的唯一真正的缺點(雖然它顯然是一個嚴重的缺點)是安全性。如果你能想到更多的缺點,那可能會讓我重新考慮。 – 2012-04-27 14:32:13