PowerShell Quirks: [IPAddress] – Konvertierungsspielchen

Neulich gab es auf Twitter eine kurze, aber interessante Diskussion, ausgelöst durch den Beitrag von Tobias Weltner bzgl. der Validierung von IPv4-Adressen mittels RegEx. Einige von uns waren der Meinung, dass die Prüfung durch Typecast, also

if ($input -as [ipaddress]) { $ip_valid = $true }

durchaus praktikabel ist. Es ist zwar offensichtlich, dass auch eine nahezu beliebige ganze Zahl (zumindest eine beliebige unsignierte 32-Bit-Zahl, also vier Bytes – nichts Anderes ist eine IPv4-Adresse ja) in einer geordneten Art und Weise in eine IPv4-Adresse gewandelt werden kann. Andererseits ist es ja an sich auch nicht schlimm – wenn jemand weiß, dass die Zahl 545454545 der IP-Adresse 209.249.130.32 zugeordnet ist, dann soll er sie halt eingeben.

Spannend wird es aber, wenn man bei der Eingabe vergisst, den eingegebenen Wert in eine Integer -Zahl zu konvertieren, bevor man ihn nach [ipaddress] castet: während

[ipaddress]545454545

die Adresse 209.249.130.32 mit numerischer Repräsentation von 545454545 ergibt, passiert etwas ganz anderes, wenn man die Zahl als String liefert, wie es z.B. Read-Host tut:

PS C:\> [ipaddress]"545454545"


Address            : 3522789920
AddressFamily      : InterNetwork
ScopeId            : 
IsIPv6Multicast    : False
IsIPv6LinkLocal    : False
IsIPv6SiteLocal    : False
IsIPv6Teredo       : False
IsIPv4MappedToIPv6 : False
IPAddressToString  : 32.130.249.209

Die Oktette sind genau anders herum angeordnet, und auch die Zahl, die als numerische Repräsentation der IP-Adresse zurückgegeben wird, ist eine völlig andere!

Die möglichen Konstruktoren für [IPAddress] sind in den Docs beschrieben. Sowohl bei Int64 als auch bei Byte-Array ist vermerkt, dass das Most Significant Byte links stehen muss. Im Falle der Adresse 209.249.130.32 würde das dem numerischen Wert 209 * 256^3 + 249 * 256 ^2 + 130 * 256 + 32 entsprechen, also genau 3522789920 aus dem obigen Beispiel! Umgekehrt, liefert 209+ 249 * 256 + 130 * 256^2 + 32 * 256^3 das Ergebnis  545454545. Wir stellen also fest:

  • Wird eine Integer-Zahl an den Konstruktor übergeben, wird sie als Least Significant Byte behandelt.
  • Wird eine Zahl als String an den Konstruktor übergeben, wird sie in Integer konvertiert und als Most Significant Byte behandelt.

Verwirrung pur – vermutlich ist es am Ende einfacher, dem Rat von Tobias Weltner zu folgen und zur Validierung einfach eine syntaktische Prüfung mit einem regulären Ausdruck vorzunehmen. Es ist klar, dass am Ende jeder Validierung auch eine Plausibilitätsprüfung stehen muss. Eine syntaktisch korrekte IP-Adresse als Eingabe ist nicht per se geeignet – sie muss zu dem zu verwaltenden Netzwerk passen!

Happy IP Addressing!

Ersten Kommentar schreiben

Antworten

Deine E-Mail-Adresse wird nicht veröffentlicht.


*


Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.