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

时间:2010-10-19 11:32:17

标签: 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);

该部分记录良好且非常直接。

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

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

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

1 个答案:

答案 0 :(得分:3)

CreateProcess函数接受两个不同的参数lpApplicationNamelpCommandLine 如果lpApplicationNameNULL,则会为令牌解析lpCommandLine以确定可执行文件,否则它将不会被传递给流程,不会更改。

As mentioned by Raymond Chen

所以我想说,如果您的startInfo.FileName来自可靠来源,您可以安全地按原样传递参数。现在,正在运行的应用程序可能无法正确分析它们并在它们出现格式错误时做了一些虚假的事情,但这是一个不同的故事。

相关问题