PowerShell 函数需要运行一个 .exe,因为它是 NuGet 包的一部分,因此在设计时不知道它的位置。如果我使用 运行它,Invoke-Expression
那么 PSScriptAnalyzer 会发出警告,告诉我寻找替代方法,但是如果我使用 运行它&
,则不会收到任何警告。
该函数是模块的一部分,用于在安装的 IDE 不支持代码覆盖率(例如 Visual Studio 社区版)的机器上运行单元测试并生成代码覆盖率报告。
function Invoke-ReportGenerator {
param (
[Parameter(Mandatory=$true)][string]$testProjectFolder,
[Parameter(Mandatory=$true)][string]$testProjectName,
[Parameter(Mandatory=$true)][string]$assemblyUnderTest,
[Parameter(Mandatory=$false)][string]$coverageXmlFilename,
[Parameter(Mandatory=$false)][string]$reportGeneratorPath
)
if ([System.String]::IsNullOrWhiteSpace($coverageXmlFilename)) {
$coverageXmlFilename = "coverage.opencover.xml";
}
$absoluteOutputPath = [System.IO.Path]::Combine($testProjectFolder, "CodeCoverage");
$absoluteInputPath = [System.IO.Path]::Combine($testProjectFolder, $coverageXmlFilename);
$argumentArray = @(
"-reports:$absoluteInputPath",
"-targetDir:$absoluteOutputPath",
"-title:$testProjectName",
"-assemblyFilters:$assemblyUnderTest"
);
if ([System.String]::IsNullOrWhiteSpace($reportGeneratorPath)) {
$reportGeneratorPath = "$env:USERPROFILE\.nuget\packages\reportgenerator\5.2.4\tools\net6.0\reportgenerator.exe ";
}
$reportGeneratorCommand = "$reportGeneratorPath $argumentArray";
Invoke-Expression $reportGeneratorCommand;
}
这是 PSScriptAnalyzer 发出的警告
Invoke-Expression is used. Please remove Invoke-Expression from script and find other options instead.
Microsoft 文档说避免使用 Invoke-Expression
仔细考虑安全隐患。当来自不受信任来源(例如用户输入)的字符串直接传递给 Invoke-Expression 时,可以执行任意命令。始终首先考虑不同的、更强大且更安全的解决方案。
如果我改变路线
Invoke-Expression $reportGeneratorCommand;
到
& $reportGeneratorCommand;
然后警告就消失了。但这肯定和一样容易受到代码注入攻击Invoke-Expression
?我遗漏了什么?
编辑:按照@MathiasRJessen 的建议替换函数的最后两行,& $reportGeneratorPath @argumentArray
可以稍微简化该函数,但我认为仍然存在漏洞。