【问题标题】:Safely escaping arguments on the command line in C#在 C# 中的命令行上安全地转义参数
【发布时间】:2011-04-27 10:33:58
【问题描述】:

我想将一些用户提供的参数传递给应用程序(在 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 调用应用程序时这是否是一个有效的问题,但谨慎的做法似乎是偏执并要求更明智的委员会。

【问题讨论】:

    标签: c# escaping command-line-arguments


    【解决方案1】:

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

    As mentioned by Raymond Chen.

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

    【讨论】:

    • 理想情况下,我希望得到更具体的确认,但似乎确实如此,感谢您的回复!
    猜你喜欢
    • 2018-10-14
    • 1970-01-01
    • 2011-07-27
    • 2010-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-02
    相关资源
    最近更新 更多