C# GetCommandLineArgs()可能获取不受信任的字符串

C# GetCommandLineArgs()可能获取不受信任的字符串,c#,checkmarx,secure-coding,C#,Checkmarx,Secure Coding,我们使用Checkmarx检查我们的项目 结果显示Environment.GetCommandLineArgs()可能获取不受信任的字符串,并允许攻击者插入任意命令 var args = Environment.GetCommandLineArgs(); var ls = new List<string>(args.Skip(1).Select(arg => QuoteDotNetCommandLineArg(arg))); Process.Start(new Proces

我们使用
Checkmarx
检查我们的项目

结果显示
Environment.GetCommandLineArgs()
可能获取不受信任的字符串,并允许攻击者插入任意命令

var args = Environment.GetCommandLineArgs();

var ls = new List<string>(args.Skip(1).Select(arg => QuoteDotNetCommandLineArg(arg)));

Process.Start(new ProcessStartInfo()
{
    FileName = args[0],
    Arguments = string.Join(" ", ls.ToArray()),
    UseShellExecute = false
});
var args=Environment.GetCommandLineArgs();
var ls=new List(args.Skip(1).Select(arg=>quotedtnetcommandlinearg(arg));
Process.Start(新的ProcessStartInfo()
{
FileName=args[0],
Arguments=string.Join(“,ls.ToArray()),
UseShellExecute=false
});

如何防止它?

Checkmarx发现您允许用户从您的程序运行任意应用程序。如果这是正确的行为,而不是安全风险,那么你可以进入CeMARX并标记警告被忽略。

在做其他事情之前验证<代码> ARGs<代码>?在更高的级别上,你应该考虑工具是如何执行它的评估的。它是基于or?我想,我遗漏了一些东西:这个程序调用自己时使用的参数与引用的参数相同???=>“返回一个字符串数组,其中每个元素都包含一个命令行参数。第一个元素是可执行文件名,以下零个或多个元素包含剩余的命令行参数。”“如何防止?”-Checkmarx文档对此有何说明?这可能允许攻击者插入任意命令,并启用命令注入攻击。我认为这是一种安全风险。“我不知道怎么解决它。”张玉杰你说的“你想”是什么意思?深入研究你的代码,看看它是否真的是一种风险。根据问题中给出的代码,我甚至无法理解实现。我是该项目的新员工。这个代码对我来说也没有意义。如果你是一个项目的新员工,并且你准备解决一个你无法理解的潜在安全风险,那么你会向你的同事寻求帮助。安全风险不是你应该掉以轻心的事情,你工作的公司也不应该掉以轻心。@zhangyujason I second Lasse。在这种情况下(或在这方面),向更高级的人寻求帮助真的不丢脸。在我的卡雷尔有不止一次的机会,我接触到一个代码让我挠头的人,他们说“哦,对了。那实际上根本没用。把它扔了吧。”-也许可以节省你的时间、精力和白发。