回答
這取決於你如何使用它。下面是從安全使用的使用分類彙總,你肯定不希望允許(運行要控制在服務器上的代碼或某種環境時):
如果使用
CSharpCodeProvider
只是爲了生成C#源代碼,那麼你只需要將生成的文件保存到某個目錄或者根本註釋的權限(如果可以將代碼生成到內存流中)如果使用它要編譯生成的C#源代碼,則需要運行
csc.exe
(在某些有限環境(例如共享主機)中可能不可用)的權限。如果你只是生成文件&編譯它們,那麼它可能不會是有害的(雖然有人可能會濫用您的應用程序生成很多很多文件,並使用某種DOS攻擊的攻擊服務器。
如果你也加載&執行生成的代碼,那麼它取決於你如何生成它。如果你認爲在C#/ CodeDOM中沒有錯誤,並且可以保證生成的代碼是安全的,那麼你應該沒問題。
如果您的代碼包含諸如
CodeSnippetExpression
之類的內容,可以提供d(用某種方式)比用戶可以在服務器上編寫和運行他或她想要的任何東西,所以這可能是相當危險的。
整理。表面上它不是一個直接的風險,因爲你不是運行代碼,只是編譯它。然而,沒有什麼說C#編譯器沒有包含某種錯誤,如果有正確的惡意輸入,它會導致它逃脫並直接開始執行命令。但是,如果您稍後執行編譯後的代碼(並且大概是這樣做的 - 否則爲什麼要編譯它以開始?),它將像您一樣運行相同的上下文。顯然,這具有各種令人不快的安全隱患,就像使用其他語言的準類似eval()
功能一樣。
我永遠不會運行一個可執行文件。輸入僅用於確保編譯代碼。所以,除了編譯器有bug之外,這是否意味着它對我剛纔提到的例子來說是完全安全的? – GenericTypeTea 2010-06-13 19:17:01
如果您只是檢查某些代碼在語法上是否有效並且編譯沒有錯誤,我看不出有什麼危害。 – 2010-06-13 21:58:39
這取決於您正在編譯的源代碼。如果您對來源有足夠的控制權,那麼這可能是一個可接受的風險。如果您允許信任範圍外的人員向編譯器提供代碼,則可能會造成不可接受的風險。
- 1. 我濫用const嗎?
- 2. 我濫用dimens.xml嗎?
- 3. 我濫用flush()調用嗎?
- 4. 這是unique_ptr的濫用嗎?
- 5. 我濫用政策嗎?
- 6. 我濫用C#泛型嗎?
- 7. perf_event_open可能被濫用syscall
- 8. 惡意用戶可能會濫用此功能嗎?
- 9. 生成使用CSharpCodeProvider
- 10. 使用會話:我濫用了嗎?
- 11. CSharpCodeProvider混淆
- 12. 濫用
- 13. 濫用
- 14. 易客戶賬號=易濫用嗎?
- 15. 這是濫用設置功能嗎?
- 16. 我在這裏濫用模板嗎?
- 17. 我濫用CakePHP的Text :: tokenize工具嗎?
- 18. 你認爲我濫用靜力學嗎?
- 19. CSharpCodeProvider在System.Collections.Generic
- 20. 是否有可能濫用allocate_ids?我可以冒險用盡id嗎?
- 21. 濫用高級代理濫用
- 22. CSharpCodeProvider編譯順序
- 23. CsharpCodeProvider內存泄漏
- 24. DynamoDB ExclusiveStartKey濫用?
- 25. 濫用Adobe Flash
- 26. 濫用OpenMP?
- 27. 濫用同步?
- 28. 濫用產量
- 29. CSharpCodeProvider符合接口
- 30. CSharpCodeProvider編譯性能
假裝一下這將是一個開放的系統,任何人都可以使用,他們將如何使用CodeSnippetExpression造成破壞?我不太明白它是如何使用的。該代碼只會使用以下設置編譯提供的代碼:GenerateExecutable = false; GenerateInMemory = TRUE;然後將用provider.CompileAssemblyFromSource調用。 – GenericTypeTea 2010-06-13 19:30:12
@GenericTypeTea:最後一點是假設前一件事是真的 - 也就是說,你加載並運行程序集。 – 2010-06-13 20:29:52