繁体   English   中英

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

[英]Safely escaping arguments on the command line in C#

我想将一些用户提供的参数传递给应用程序(在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调用应用程序时这是否是一个有效的问题,但是看起来谨慎是偏执并要求更聪明的理事会。

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

正如Raymond Chen所说

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM