在C#中安全地转义命令行中的参数

Iai*_*ins 7 c# escaping command-line-arguments

我想将一些用户提供的参数传递给应用程序(在Windows上使用C#).

参数位于NameValueCollection中,我希望将它们作为字符串传递,以便可以使用提供的参数调用应用程序并使用ProcessStartInfo调用:

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

这部分记录良好且非常简单.

但是,由于在我的场景中构造这些参数的性质(用户提供;可能通过一个很容易被恶意制作的URL),我希望确保它们被正确转义(例如,没有人能够注入转义字符或引用,这将导致调用另一个应用程序或执行其他操作).

我希望确保参数名称或值中的字符没有命令注入的风险.我不清楚我是否应该尝试逃避任何字符,和/或是否存在此功能.

我主要来自Mac和Unix背景,并且不确定在通过ProcessStartInfo调用应用程序时这是否是一个有效的问题,但是看起来谨慎是偏执并要求更聪明的理事会.

GSe*_*erg 3

CreateProcess函数接受两个不同的参数,lpApplicationNamelpCommandLine
如果lpApplicationNameNULLlpCommandLine将解析令牌以确定可执行文件,否则不会并将其传递给进程,不变。

正如陈雷蒙德所说

所以我想说,只要您的startInfo.FileName来源来自可信来源,您就可以安全地按原样传递参数。现在,正在运行的应用程序可能无法正确分析它们,并在它们格式错误的情况下执行一些虚假操作,但这是一个不同的故事。