2010-10-19 68 views
7

我想將一些用戶提供的參數傳遞給應用程序(在Windows上使用C#)。在C#中命令行安全地轉義參數

的參數是一個NameValueCollection中,我希望使用所提供的參數將它們作爲一個字符串傳遞,這樣應用程序可以被調用,調用使用的ProcessStartInfo:

ProcessStartInfo startInfo = new ProcessStartInfo(); 
startInfo.UseShellExecute = true; 
startInfo.FileName = executableName; 
startInfo.Arguments = arguments; 
startInfo.Verb = "runas"; 
Process p = Process.Start(startInfo); 

那部分是有據可查的,非常簡單。但是,由於在我的場景(用戶提供;可能通過一個非常容易惡意製作的URL)中構造這些參數的性質,我希望確保它們能夠正確轉義(例如,沒有人能夠注入轉義字符或會導致另一個應用程序被調用或執行其他操作的引用)。

我希望確保從參數名稱或值中的字符不會有命令注入的風險。我不清楚我是否應該試圖逃避任何角色,並且/或者是否存在現有的功能。

我主要來自Mac的背景,我不確定在通過ProcessStartInfo調用應用程序時,這是否甚至是一個有效的擔憂,但似乎謹慎是偏執狂,並要求更聰明的理事會。

回答

3

CreateProcess函數接受兩個不同的參數,lpApplicationNamelpCommandLine
如果lpApplicationNameNULL,lpCommandLine將被解析爲令牌來確定可執行文件,否則它將不會被傳遞到進程,並且不會改變。

As mentioned by Raymond Chen

所以我會說,只要您的startInfo.FileName來自可靠的來源,您可以安全地傳遞參數。現在,正在運行的應用程序可能無法正確地分析它們,並且在錯誤的情況下做一些虛假的事情,但這是一個不同的故事。

+0

我希望得到稍微更具體的確認,但確實如此,謝謝你的回覆! – 2010-10-26 14:24:46