我建立一個條件格式功能,用戶可以在其中輸入像如何使用戶輸入的C#代碼安全?
someFieldValue == "someValue"
表達式,我們採用基於表達式的結果格式化。使用全功能表達式語法完成此操作的最快方法似乎是CSharpCodeProvider.CompileAssemblyFromSource
。
由於表達式是由用戶輸入的,所以這是一個巨大的安全漏洞(例如用戶可以輸入表達式someFieldValue == Process.Start("shutdown","/s /t 0")
)。
問題:IF這是在生產系統上,我怎麼能保證輸入的表達式不會造成問題?現在它只是一個內部工具,但如果我們將它展示給生產系統,我希望能夠做好準備,而不是走下一條路徑(C#CodeDom),以便稍後取消它。
會被認爲不安全的一些事情:
- 退出應用程序
- 訪問/修改本地資源,如文件/註冊表/系統設置
- 修改對象在內存
- 崩潰調用進程
- 啓動應用程序
- ...
因爲它是不合理的枚舉所有的東西,你不能做,我的感覺是,該解決方案將涉及修改用戶輸入的表達式,它暴露的所有功能,我們都願意代理對象進行操作暴露於表達。這意味着不允許在表達式中進行任意函數調用。這也意味着該表達式不再是標準的C#代碼,並且最後爲此可能更加實用一些不同的語言語法。
能夠使用C#的好處是巨大,因爲我們希望允許在C#中使用表達式中的「插件」,並且它允許與現有代碼進行良好的無縫集成。我接受一種解決方案是使用JavaScript這樣的腳本語言,但我想確保我們必須首先排除C#。
也許使用DynamicExpression來允許一定數量的運算符/表達式。或者更一般地說,將表達式字符串解析到表達式樹中,您可以在其中獲得允許的節點列表。 – 2012-01-18 11:04:23
您正在描述一名用戶正在攻擊*自己*。用戶被允許攻擊自己。爲什麼這是一個安全漏洞? – 2012-01-18 15:14:01
Web服務器。表達式是由客戶端輸入的,但是如果訪問權限不受限制,它們可能會對服務器造成嚴重破壞。目前它只是供內部使用,所以這不是問題,但在生產中它是不可接受的。儘管AppDomain解決了這個問題。 – tenfour 2012-01-18 15:22:05