Безопасное экранирование аргументов в командной строке в C # - PullRequest
7 голосов
/ 19 октября 2010

Я хотел бы передать некоторые пользовательские аргументы приложению (используя 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 Ответ

3 голосов
/ 19 октября 2010

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

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

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

...