2012-01-18 58 views
2

我建立一個條件格式功能,用戶可以在其中輸入像如何使用戶輸入的C#代碼安全?

someFieldValue == "someValue" 

表達式,我們採用基於表達式的結果格式化。使用全功能表達式語法完成此操作的最快方法似乎是CSharpCodeProvider.CompileAssemblyFromSource

由於表達式是由用戶輸入的,所以這是一個巨大的安全漏洞(例如用戶可以輸入表達式someFieldValue == Process.Start("shutdown","/s /t 0"))。

問題:IF這是在生產系統上,我怎麼能保證輸入的表達式不會造成問題?現在它只是一個內部工具,但如果我們將它展示給生產系統,我希望能夠做好準備,而不是走下一條路徑(C#CodeDom),以便稍後取消它。

會被認爲不安全的一些事情:

  • 退出應用程序
  • 訪問/修改本地資源,如文件/註冊表/系統設置
  • 修改對象在內存
  • 崩潰調用進程
  • 啓動應用程序
  • ...

因爲它是不合理的枚舉所有的東西,你不能做,我的感覺是,該解決方案將涉及修改用戶輸入的表達式,它暴露的所有功能,我們都願意代理對象進行操作暴露於表達。這意味着不允許在表達式中進行任意函數調用。這也意味着該表達式不再是標準的C#代碼,並且最後爲此可能更加實用一些不同的語言語法。

能夠使用C#的好處是巨大,因爲我們希望允許在C#中使用表達式中的「插件」,並且它允許與現有代碼進行良好的無縫集成。我接受一種解決方案是使用JavaScript這樣的腳本語言,但我想確保我們必須首先排除C#。

+0

也許使用DynamicExpression來允許一定數量的運算符/表達式。或者更一般地說,將表達式字符串解析到表達式樹中,您可以在其中獲得允許的節點列表。 – 2012-01-18 11:04:23

+0

您正在描述一名用戶正在攻擊*自己*。用戶被允許攻擊自己。爲什麼這是一個安全漏洞? – 2012-01-18 15:14:01

+1

Web服務器。表達式是由客戶端輸入的,但是如果訪問權限不受限制,它們可能會對服務器造成嚴重破壞。目前它只是供內部使用,所以這不是問題,但在生產中它是不可接受的。儘管AppDomain解決了這個問題。 – tenfour 2012-01-18 15:22:05

回答

2

我想你應該看看這個;

Assembly.CreateInstance and security

這個建議的方法是在 沙盒應用程序域執行可疑代碼。在 http://blogs.msdn.com/b/shawnfa/archive/2006/04/19/579066.aspx和 上給出了幾個原因,更重要的一點是從.NET 4.0開始,已棄用大多數其他潛在方法 。

+2

謝謝 - 我現在已經實現了這一點,實際上AppDomain正是我所需要的。對於那些有興趣的人來說,一個好的資源是[這篇文章](http://msdn.microsoft.com/en-us/library/bb763046.aspx) – tenfour 2012-01-18 13:51:28

相關問題