7

PowerShellでハッシュテーブルをいじっていたところ、アイテムへのアクセスに関連する奇妙な動作に気づきました。ご存知のとおり、PowerShellでは、ハッシュテーブルエントリに値を割り当てるための少なくとも3つの異なる方法が許可されています。

$hashtable["foo"] = "bar"        #1
$hashtable.Item("foo") = "bar"   #2
$hashtable.foo = "bar"           #3

一方、#3構文を使用して、、、などのハッシュテーブルオブジェクト自体のプロパティにアクセスします。Count内部プロパティの名前と競合するキーを持つアイテムを追加すると、PowerShellでアクセスできるようになります。 、およびプロパティの値を事実上読み取ることができなくなりました(Reflectionを使用する場合を除く)。KeysValues

キーが信頼できないソース(外部ファイルやネットワークなど)からのものである場合、これはフロー制御に望ましくない影響を与える可能性があり、悪意のあるユーザーによって悪用される可能性があると思います。

このスニペットは、問題を示しています。

function Get-HashtableProperties($hashTable, $header)
{
    "{0} {1} {0}" -f ("-" * 10), $header

    "Count                      : {0}" -f $hashtable.Count
    "Keys.Count                 : {0}" -f $hashtable.Keys.Count
    "Values.Count               : {0}" -f $hashtable.Values.Count
    "Actual Count (Reflection)  : {0}" -f $hashtable.GetType().GetProperty("Count").GetValue($hashtable)

    "`nItems (Keys iteration):"
    $hashtable.Keys | ForEach-Object { "  [ {0} = {1} ]" -f $_, $hashtable.Item($_) }

    "`nItems (Enumerator iteration):"
    $enumerator = $hashTable.GetEnumerator()
    while ($enumerator.MoveNext())
    {
        "  [ {0} = {1} ]" -f $enumerator.Current.Key, $enumerator.Current.Value
    }
}

$fileContent = @"
    Foo = a
    Bar = b
"@

$maliciousFileContent = @"
    Foo = a
    Bar = b
    Count = 0
    Keys =
    Values =
"@

$hashtable = ConvertFrom-StringData $fileContent
$damagedHashtable = ConvertFrom-StringData $maliciousFileContent

Get-HashtableProperties $hashtable "Normal Hash Table"
Get-HashtableProperties $damagedHashtable "Damaged Hash Table"

出力:

---------- Normal Hash Table ----------
Count                      : 2
Keys.Count                 : 2
Values.Count               : 2
Actual Count (Reflection)  : 2

Items (Keys iteration):
  [ Bar = b ]
  [ Foo = a ]

Items (Enumerator iteration):
  [ Bar = b ]
  [ Foo = a ]
---------- Damaged Hash Table ----------
Count                      : 0
Keys.Count                 : 1
Values.Count               : 1
Actual Count (Reflection)  : 5

Items (Keys iteration):
  [  =  ]

Items (Enumerator iteration):
  [ Count = 0 ]
  [ Bar = b ]
  [ Foo = a ]
  [ Values =  ]
  [ Keys =  ]

質問:割り当て前にすべてのキーを手動でチェックしたり、プロパティの値にアクセスする必要があるときにコード内のあらゆる場所でReflectionを使用したりすることを除いて、この問題から保護する方法はありHashtableますか?

4

1 に答える 1

5

この種のシナリオでは、次のようにHashtableのcountプロパティにアクセスできます。

C:\PS> $ht = @{Count = 99}
$ht.psbase.Count
1

PowerShellの拡張型システムは、これらのPS*プロパティを介してオブジェクトにいくつかの異なるビューを提供します。詳細については、PowerShellチームのブログ投稿を参照してください。

于 2013-02-27T22:24:22.610 に答える