在我们的环境中,我们使用 Injection Hunter 检测易受攻击的代码。另请参阅:PowerShell 脚本的安全审核
$Object.$Property = $SomethingElse
由于某种原因,注入猎人检测到类似and $Object.$Property
for a$Property
和$Object
like的语法存在风险:$Property = 5; $Object = [PSCustomObject]@{ Property = 'Something' }
Invoke-ScriptAnalyzer -CustomRulePath $InjectionHunterPath -ScriptDefinition {
$Object = [PSCustomObject]@{ Property = 'Something' }
$Property = 'Property'
$Object.$Property = 'SomethingElse'
}.ToString()
RuleName Severity ScriptName Line Message
-------- -------- ---------- ---- -------
InjectionRisk.StaticPropertyInjecti Warning 4 Possible property access injection via dynamic member
on access. Untrusted input can cause arbitrary static
properties to be accessed: $Object.$Property
$Property
但我看不出如果在同一脚本(甚至同一范围)中定义了如何利用这一点。这可以被视为误报吗?
此外,我想知道防止警告的最干净的语法是什么(除了抑制警告之外)。我已经尝试过一些事情,$Object.[String]$Property
但迄今为止我能找到的最好的替代品是相当麻烦的:
$Object.PSObject.Properties.where{$_.Name -eq 'Property'}[0].Value = 'SomethingElse'
换句话说,如何安全地修改动态对象成员?