Безопасное экранирование аргументов в командной строке на 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, но кажется разумным быть параноиком и попросить более мудрого совета.


person Iain Collins    schedule 19.10.2010    source источник


Ответы (1)


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

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

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

person GSerg    schedule 19.10.2010
comment
В идеале я надеялся на более конкретное подтверждение, но, похоже, это так, спасибо за ответ! - person Iain Collins; 26.10.2010