IP-Adressbereiche einschränken

qsrs

Erfahrenes Mitglied
Hallo,

ich möchte in einem bereits vorhanden System realisieren, dass man IP-Adressbereiche sperren kann. Wie ich die IP des Besuchers bekomme, ist klar. Wie ich einzelne Adressen sperren könnte, ist mir auch klar, ich speichere sie in einer Tabelle und vergleiche dann. Aber wie kann ich es mit einem ganzen Bereich realisieren? Ich möchte zwei Eingabefelder zur Verfügung stellen, mit welchen man den Bereich festlegt, z.B.

Textfeld 1, Eingabe: 192.168.1.1
Textfeld 2, Eingabe: 192.168.1.100

D.h. es würde alles gesperrt, was im letzten Bit zwischen 1 und 100 liegt. Wie würde die PHP-Abfrage aussehen und wer kann mir nützliche Hinweise geben, wie es mit den IP-Adressen aussieht. Also auch, wie man am Besten sperrt und wie die Abfrage aussieht, wenn man Bereiche im 3. Bit sperrt oder im 2. Vielen Dank für eure Antworten.
 
Hi,

sollte so funktionieren:

PHP:
$thisIPlong = ip2long($_SERVER["REMOTE_ADDR"]);
  if ( ($thisIPlong >= ip2long($Eingabe1)) && ($thisIPlong <= ip2long($Eingabe2)) ) {
    die("Forbidden");
  }  
}

Gruß
Marc
 
Jetzt habe ich doch noch eine Frage. Wie gehe ich vor, wenn ich nicht nur zwei Werte habe. Ich möchte mehrere IP-Adressbereiche in einer Tabelle speichern. Z.B.

192.168.1.1 - 192.168.1.100
192.160.1.1 - 192.160.1.50
usw.

Wie kann ich nun die IP des Besuchers mit den Bereichen in der Datenbank, die ja dann viele IP-Adressbereiche haben kann die eingeschränkt werden, vergleichen? Mit einem Wert funktioniert es ja mit dem obigen Code ohne Probleme. Wie funktioniert es aber, wenn ich viele Werte habe, und in diesen Bereichen jeweils die IP des Besuchers abfragen möchte? Vielen Dank für Antworten.
 
Müssteeigentlich funktionieren:
PHP:
$thisIPlong = ip2long($_SERVER["REMOTE_ADDR"]);
  if ( ($thisIPlong >= ip2long($Eingabe1)) && ($thisIPlong <= ip2long($Eingabe2)) || $thisIPlong >= ip2long($Eingabe3)) && ($thisIPlong <= ip2long($Eingabe4)) )
 {
    die("Forbidden");
  }  
}
Du musst einfach an splat's script in der If anfrage folgendes anhängen:
PHP:
|| $thisIPlong >= ip2long($EingabeX)) && ($thisIPlong <= ip2long($EingabeY))
|| heißt oder.
Das bedeutet, sobald ein wert zutrifft, wird die Anweisung ausgeführt.
 
Wenn du eine ganze Tabelle voll mit IP Adressbereichen hast, dann machst du dir dafür besser eine Schleife, sonst musst du das Script jedesmal anpassen sobald du neue Bereiche hinzufügst.

PHP:
<?php
$thisIPlong = ip2long($_SERVER["REMOTE_ADDR"]);

$res = mysql_query("SELECT Anfang, Ende FROM tabelle");
while ($IP = mysql_fetch_object($res)) {
  if ( ($thisIPlong >= ip2long($IP->Anfang)) && ($thisIPlong <= ip2long($IP->Ende)) ) {
    die("Forbidden");
  }  
}
?>
 
Habe noch etwas geadded. So kannst du dich nicht selbst blocken, man weiß ja nie.. :)

PHP:
<?php
$thisIP = $_SERVER["REMOTE_ADDR"];
$thisIPlong = ip2long($thisIP);

$res = mysql_query("SELECT Anfang, Ende FROM tabelle");
while ($IP = mysql_fetch_object($res)) {
  if ( ($thisIPlong >= ip2long($IP->Anfang)) && ($thisIPlong <= ip2long($IP->Ende)) ) {
    if ($thisIP != $_SERVER["SERVER_ADDR"]) {
      die("Forbidden");
    }
  }  
}
?>

Gruß
Marc
 
Und nun doch noch einmal eine Frage. Ich habe das Ganze jetzt erweitert. Die Erweiterung:

- Ich habe Adressbereiche + einzelne IP-Adressen
- Ich möchte jeweils gesperrte und freie Adressen pflegen
- Ich möchte, dass nicht bekannte Adressen und Bereiche nicht erlaubt sind (d.h., ist eine IP-Adresse oder ein Bereich nicht in der Tabelle, dann soll die IP geblockt werden, genauso, wenn die Adresse oder der Bereich in der Tabelle ist, jedoch gesperrt ist)

Und im letzten Punkt tritt mein Problem auf. Es funktioniert noch nicht. Ich möchte, dass nicht bekannte Adressen und Bereiche ebenfalls geblockt werden, und auch die bekannten, die aber explizit gesperrt wurden. Mein Versuch war folgender:

PHP:
elseif ($array1[firewall_status] == "deny_unknown") {
 $this_ip = $_SERVER["REMOTE_ADDR"];
 $this_ip_long = ip2long ($this_ip);
 $query8 = mysql_query ("SELECT `ip_address_one`, `ip_address_two` FROM `$dbtable13` WHERE `ip_address_type` = 'ip_address_range' AND `ip_address_status` = 'unlocked'");
 while ($ip = mysql_fetch_object ($query8)) {
  if (($this_ip_long >= ip2long ($ip->ip_address_one)) && ($this_ip_long <= ip2long ($ip->ip_address_two))) {
   if ($this_ip != $_SERVER["SERVER_ADDR"]) {
    //Do nothing
    }
   }
  else {
   echo "Forbidden";
   }
  }
 $query9 = mysql_query ("SELECT `ip_address_one` FROM `$dbtable13` WHERE `ip_address_type` = 'ip_address' AND `ip_address_status` = 'unlocked'");
 while ($ip2 = mysql_fetch_object ($query9)) {
  if (($this_ip_long == ip2long ($ip2->ip_address_one))) {
   if ($this_ip != $_SERVER["SERVER_ADDR"]) {  
    //Do nothing
    }
   }
  else {
   echo "Forbidden";
   }
  }
 }

Ich würde mich über Hilfe sehr freuen. Vielen Dank.
 
Zurück