Marvin: Wir zensieren zurück – nur wem…

Jaja, ganz tolles Plugin, aber wie das so ist mit PHP, schaut man besser über fremden Code drüber, bevor man ihn einsetzt. Folgender Code wird verwendet, um festzustellen, ob eine IP in einem Adressbereich liegt.

if($c[0] >= $a[0] && $c[0] <= $b[0]){
 if($c[1] >= $a[1] && $c[1] <= $b[1]){
  if($c[2] >= $a[2] && $c[2] <= $b[2]){
   if($c[3] >= $a[3] && $c[3] <= $b[3]){
    die(zurueckzensur_zensur_message());
   }
  }
 }
}

$A, $b und $c sind dabei via explode getrennte IP-Adressen (also ein 4-Array mit jeweils einem IPv4-Tupel den Tupel-Komponenten als Elemente). Nehmen wir nun mal den Adressbereich der Staatsregierung Sachsen:

193.159.218.0-193.159.219.191

In diesem Range ist die Adresse 193.159.218.200 enthalten. Das Plugin wird diese IP jedoch nicht erkennen. Eine etwas sauberere Feststellung, ob eine IP in einem Adressbereich liegt wäre:

$a = $a[0] << 24 + $a[1] << 16 + $a[2] << 8 + $a[3];
$b = $b[0] << 24 + $b[1] << 16 + $b[2] << 8 + $b[3];
$c = $c[0] << 24 + $c[1] << 16 + $c[2] << 8 + $c[3];
if (($a <= $c) && ($c <= $b)) die(zurueckzensur_zensur_message());

Ich stelle diesen Code zur Diskussion. Gegenstimmen?

Update: Ich habe die Multiplikationen noch durch shifts ersetzt.

2 Comments Posted in PHP, Politik
Tagged , ,

2 Comments

  1. Ich kann ja kein PHP, aber wie wär’s mit http://us3.php.net/manual/en/function.ip2long.php

    echo is_in_range(‘193.159.218.200′) ? ‘ja’:'nein’;
    function is_in_range ($ip) {
    $range_1 = ip2long(‘193.159.218.0′);
    $range_2 = ip2long(‘193.159.219.191′);
    $ip = ip2long($ip);
    return $ip >= $range_1 && $ip <= $range_2;
    }

  2. kommt aufs gleiche hinaus, ist natuerlich deutlich schoener. In den kommentaren zu der hilfeseite findet man auch eine ipv6-kompatible variante.

Leave a Reply

Using Gravatars in the comments - get your own and be recognized!

XHTML: These are some of the tags you can use: <a href=""> <b> <blockquote> <code> <em> <i> <strike> <strong>