2010-06-13 106 views

回答

5

這取決於你如何使用它。下面是從安全使用的使用分類彙總,你肯定不希望允許(運行要控制在服務器上的代碼或某種環境時):

  • 如果使用CSharpCodeProvider只是爲了生成C#源代碼,那麼你只需要將生成的文件保存到某個目錄或者根本註釋的權限(如果可以將代碼生成到內存流中)

  • 如果使用它要編譯生成的C#源代碼,則需要運行csc.exe(在某些有限環境(例如共享主機)中可能不可用)的權限。

  • 如果你只是生成文件&編譯它們,那麼它可能不會是有害的(雖然有人可能會濫用您的應用程序生成很多很多文件,並使用某種DOS攻擊的攻擊服務器。

  • 如果你也加載&執行生成的代碼,那麼它取決於你如何生成它。如果你認爲在C#/ CodeDOM中沒有錯誤,並且可以保證生成的代碼是安全的,那麼你應該沒問題。

  • 如果您的代碼包含諸如CodeSnippetExpression之類的內容,可以提供d(用某種方式)比用戶可以在服務器上編寫和運行他或她想要的任何東西,所以這可能是相當危險的。

+0

假裝一下這將是一個開放的系統,任何人都可以使用,他們將如何使用CodeSnippetExpression造成破壞?我不太明白它是如何使用的。該代碼只會使用以下設置編譯提供的代碼:GenerateExecutable = false; GenerateInMemory = TRUE;然後將用provider.CompileAssemblyFromSource調用。 – GenericTypeTea 2010-06-13 19:30:12

+0

@GenericTypeTea:最後一點是假設前一件事是真的 - 也就是說,你加載並運行程序集。 – 2010-06-13 20:29:52

2

整理。表面上它不是一個直接的風險,因爲你不是運行代碼,只是編譯它。然而,沒有什麼說C#編譯器沒有包含某種錯誤,如果有正確的惡意輸入,它會導致它逃脫並直接開始執行命令。但是,如果您稍後執行編譯後的代碼(並且大概是這樣做的 - 否則爲什麼要編譯它以開始?),它將像您一樣運行相同的上下文。顯然,這具有各種令人不快的安全隱患,就像使用其他語言的準類似eval()功能一樣。

+0

我永遠不會運行一個可執行文件。輸入僅用於確保編譯代碼。所以,除了編譯器有bug之外,這是否意味着它對我剛纔提到的例子來說是完全安全的? – GenericTypeTea 2010-06-13 19:17:01

+0

如果您只是檢查某些代碼在語法上是否有效並且編譯沒有錯誤,我看不出有什麼危害。 – 2010-06-13 21:58:39

1

這取決於您正在編譯的源代碼。如果您對來源有足夠的控制權,那麼這可能是一個可接受的風險。如果您允許信任範圍外的人員向編譯器提供代碼,則可能會造成不可接受的風險。