代码之家  ›  专栏  ›  技术社区  ›  Iain Collins Ryan

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

  •  7
  • Iain Collins Ryan  · 技术社区  · 15 年前

    我想将一些用户提供的参数传递给应用程序(在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 回复  |  直到 15 年前
        1
  •  3
  •   GSerg    15 年前

    CreateProcess 函数接受两个不同的参数, lpApplicationName lpCommandLine .
    如果 lpapplicationname(应用程序名称) NULL , L命令行 将对令牌进行分析以确定可执行文件,否则它将不会并将被传递给进程,保持不变。

    As mentioned by Raymond Chen .

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

    推荐文章