# IP-Adressbereiche einschränken



## qsrs (25. Juli 2007)

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.


----------



## saftmeister (25. Juli 2007)

Warum nicht über .htaccess und "Allow from x" machen?


----------



## splat (25. Juli 2007)

Hi,

sollte so funktionieren:


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

Gruß
Marc


----------



## qsrs (27. Juli 2007)

splat hat gesagt.:


> Hi,
> 
> sollte so funktionieren:
> 
> ...


Genau das ist es, vielen Dank.



> Warum nicht über .htaccess und "Allow from x" machen?


 Weil es plattformunabhängig funktionieren muss.


----------



## qsrs (28. Juli 2007)

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.


----------



## Acriss (28. Juli 2007)

Müssteeigentlich funktionieren:

```
$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:

```
|| $thisIPlong >= ip2long($EingabeX)) && ($thisIPlong <= ip2long($EingabeY))
```
|| heißt oder.
Das bedeutet, sobald ein wert zutrifft, wird die Anweisung ausgeführt.


----------



## splat (28. Juli 2007)

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
$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");
  }  
}
?>
```


----------



## splat (28. Juli 2007)

Habe noch etwas geadded. So kannst du dich nicht selbst blocken, man weiß ja nie.. 


```
<?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


----------



## qsrs (31. Juli 2007)

Hat klasse funktioniert. Vielen Dank für deine Hilfe!


----------



## qsrs (8. August 2007)

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:


```
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.


----------



## mr_arrogant (8. August 2007)

Wenn du das schon so Stark eingrenzen willst, wäre dann nicht eine *erweiterte *IP Range Verwaltung sinnvoll ?


----------



## qsrs (8. August 2007)

Mir würde eigentlich die Funktion, so wie oben erwähnt, ausreichen.


----------



## mr_arrogant (8. August 2007)

qsrs hat gesagt.:


> Mir würde eigentlich die Funktion, so wie oben erwähnt, ausreichen.


Okay 

Ich habe nämlich mal etwas ähnliches für einen Kunden entwickeln dürfen und dieser wollte wirklich volle Kontrolle über die Zugriffsberechtigung einer IP haben.


mfg
mr-d


----------

