diff --git a/helper.php b/helper.php index 0597058..485af29 100644 --- a/helper.php +++ b/helper.php @@ -20,7 +20,20 @@ function ipInNetwork($ip, $cidr) if ($adresse === false || $netz === false || strlen($adresse) !== strlen($netz)) { return false; // ungueltig oder verschiedene Adressfamilien } - $bits = isset($teile[1]) ? intval($teile[1]) : strlen($adresse) * 8; + // Praefixlaenge streng pruefen. Ohne das macht ein Tippfehler in + // LOCAL_NETWORKS die Funktion fail-open: "/-5" etwa liefert eine + // Nullmaske, und dann liegt jede Adresse in jedem Netz. + if (isset($teile[1])) { + if (!ctype_digit($teile[1])) { + return false; + } + $bits = intval($teile[1]); + if ($bits > strlen($adresse) * 8) { + return false; + } + } else { + $bits = strlen($adresse) * 8; + } $ganzeBytes = intdiv($bits, 8); $restBits = $bits % 8; if ($ganzeBytes > 0 && strncmp($adresse, $netz, $ganzeBytes) !== 0) {