Безопасное экранирование аргументов в командной строке в C#

Я хотел бы передать некоторые пользовательские аргументы приложению (используя C# в Windows).

аргументы находятся в NameValueCollection, и я хочу передать их как строку, чтобы приложение можно было вызвать с помощью предоставленных аргументов и вызвать с помощью ProcessStartInfo:

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

эта часть хорошо документирована и очень проста.

однако из-за характера, по которому эти аргументы будут построены в моем сценарии (пользователь поставляемый; потенциально через URL-адрес, так легко злонамеренно созданный), я хочу быть уверен, что они правильно экранированы (например, никто не может ввести escape-символ или цитату, которые вызовут другое приложение или другое действие).

Я хочу быть уверен, что нет риска ввода команды из символов в имени или значении аргумента. Я не понимаю, должен ли я пытаться избежать каких-либо символов или нет, и / или если есть существующий функция для этого.

Я преимущественно из фона Mac & Unix и не уверен, что это даже допустимая проблема, когда дело доходит до вызова приложения через ProcessStartInfo, но кажется разумным быть параноиком и просить более мудрый совет.

1 ответов


является CreateProcess функция принимает два различных параметра,lpApplicationName и lpCommandLine.
Если lpApplicationName is NULL, lpCommandLine будет проанализирован для токенов, чтобы определить исполняемый файл, иначе он не будет и будет передан процессу без изменений.

как упоминал Раймонд Чен.

так я бы сказал, при условии вашего startInfo.FileName исходит из надежного источника, вы можете безопасно передавать аргументы как есть. Теперь приложение запускается может не правильно проанализировать их и сделать что-то фальшивое в случае, если они деформированы, но это другая история.