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

7

我希望能够在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个回答

3

CreateProcess函数接受两个不同的参数,lpApplicationNamelpCommandLine
如果lpApplicationNameNULL,则会对lpCommandLine进行分析以确定可执行文件,否则不会进行分析并将其不加更改地传递给进程。

如 Raymond Chen 所提到的

因此,如果您的startInfo.FileName来自可信源,则可以安全地传递参数。现在,正在运行的应用程序可能无法正确地分析它们,并在它们格式不正确时执行错误操作,但这是另一回事。


我本来希望得到更具体的确认,但看起来事实确实是如此,感谢你的回复! - Iain Collins

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接