Länderfilter

dbarthel

Lounge-Member
Hallo,

ich bin auf der Suche nach einem Script, mit dem ich, anhand der IP, bestimmte Länder filtern/blockieren kann.
Zudem sollte es möglich sein, zu erkennen, ob ein Proxy oder ein VPN aktiv ist (VPNs liefern IPs im Format XXX.XX.XXX.XXX, also immer vorn mit 3 Stellen, während Proxys vorn nur 2 Stellen geben)

Da ich mich mit Json gar nicht auskenne, wäre ein anderer Lösungsweg gewünscht.
Falls das nicht möglich ist, brauche ich eben ganz viel Hilfe ;)

PS: Sollte dies hier der falsche Ort für den Thread sein, bitte verschieben.
Da ich nicht weiß, mit welcher Technik man sowas machen kann, habe ich auch nicht gewusst, in welchen Bereich ich das ganze stellen soll.
 
Hier kannst du dir eine .htaccess erstellen lassen: Block Visitors by Country | IP2Location.com
Hinweis an dieser Stelle: so etwas täte ich im Produktiveinsatz auf keinen Fall machen - so sind beispielsweise die IP-Ranges nur grob zugeordnet; d.h., nur weil jemand diese IP hat, muss er nicht aus dem jeweiligen Land sein und andersherum ebenfalls.


Zudem sollte es möglich sein, zu erkennen, ob ein Proxy oder ein VPN aktiv ist (VPNs liefern IPs im Format XXX.XX.XXX.XXX, also immer vorn mit 3 Stellen, während Proxys vorn nur 2 Stellen geben)
Wo hast du denn das her? Denn stimmen tut das so nicht.
Zwecks Proxyerkennung: da musst du mal schauen, ob irgendwas im "Forwarded for"-Header steht oder sich Remote_Addr und X-Real-IP unterscheiden. Aber klappen tut das dann nur bei "Transparent"-Proxies. Es ist unmöglich, einen "High-Anonymity"-Proxy bzw. VPN zu erkennen - es sei denn, man führt eine Liste von bekannten Servern der VPN-Anbieter...
 
Wo hast du denn das her? Denn stimmen tut das so nicht.

Das hat mir ein Kollege, der bei einem Intermet-Provider arbeitet so gesagt und geneint, VPNs würden IPs aus dem privaten IP-Bereich zuweisen, quasi so als ob man in einem Firmebnetzwerk ist.

Wollte das ganze nicht per .htaccess machen, da das, wie du schon sagst, zu ungenau ist, nur auf Apache Servern geht und zudem unschön ist.

Gibt's da noch eine andere Möglichkeit?

Du hattest doch irgendwo mal so ne Api, zwar mit json, die auch Geo-Daten abfragte.
Ich dachte eher an sowas, und das man diese Geos filtern könnte, und bestimmte Länder eben umleiten/blocken.
Wenn es sowas, ohne json gibt, wäre das glaube ich ideal.

- - - Aktualisiert - - -

Wenn es sowas nur mit json gibt, vielleicht könnte mir dann jemand helfen und an einem Beispiel zeigen, wie man da dasLand auslesen und prüfen kann.
 
Zuletzt bearbeitet:
Wollte das ganze nicht per .htaccess machen, da das, wie du schon sagst, zu ungenau ist, nur auf Apache Servern geht und zudem unschön ist.
Die .htaccess macht allerdings eigentlich auch nichts anderes; und die GeoIP-APIs sind alle ungenau.

Wenn es sowas nur mit json gibt, vielleicht könnte mir dann jemand helfen und an einem Beispiel zeigen, wie man da dasLand auslesen und prüfen kann.
Gerne:
PHP:
$blocked_countries = array("DE", "US");

$get = "http://www.telize.com/geoip/".$_SERVER["REMOTE_ADDR"];
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $get);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HEADER, false);
$IPinfo = curl_exec($curl);
curl_close($curl);

$IPinfo = json_decode($IPinfo);
$country = $IPinfo->country_code;
if(in_array($country, $blocked_countries)){
  die();
}
 
Zuletzt bearbeitet:
Danke dir erstmal.

Wenn sowohl die Geo-Apis als auch die .htaccess Lösungen ungenau sind, gibt's da keine Lösung, die genauer ist?
 
Wenn sowohl die Geo-Apis als auch die .htaccess Lösungen ungenau sind, gibt's da keine Lösung, die genauer ist?
Vorsicht - wie gesagt besteht da kein Unterschied: die GeoIP-APIs und die IP-Listen für die htaccess basieren alle auf dem selben Prinzip, nämlich Datenbanken von IP-Adressen/-Ranges, die bestimmten Regionen zugeordnet sind.
Eine genauere Lösung gibt es nicht, nein. Generell macht eine Ländersperre in meinen Augen ohnehin wenig Sinn - jemanden der "böses" im Schilde führt, hält das sowieso nicht ab, und alle anderen User werden dadurch nur ungerechtfertigterweise eingeschränkt...
 
Ok Danke für deine Antwort.
Prinzipiell bin ich auch kein Freund von solchen Sperren, aber aus rechtlichen Gründen ist dies teilweise nötig und auf Grund von Mißbrauch, welcher vorwiegend von bestimmten Landsleuten ausgeht, ratsam geworden.
Werde beide Techniken mal testen, aber bei den Geo-Apis kann ich auf eine Hinweisseite umleiten.
 
bei den Geo-Apis kann ich auf eine Hinweisseite umleiten.
Richtig, oder du bindest folgende oder ähnliche Datei automatisch am Anfang jedes Skripts ein:
PHP:
<?php

//ip_geocheck.php

$blocked_countries = array("DE", "US"); 

$get = "http://www.telize.com/geoip/".$_SERVER["REMOTE_ADDR"];
$curl = curl_init(); 
curl_setopt($curl, CURLOPT_URL, $get); 
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HEADER, false); 
$IPinfo = curl_exec($curl); 
curl_close($curl); 

$IPinfo = json_decode($IPinfo);
$country_fullName = $IPinfo->country;
$country = $IPinfo->country_code; 
if(in_array($country, $blocked_countries)){
  ?>
  <?php header("Content-type: text/html; charset=UTF-8"); ?>
  <!doctype HTML>
  <html>
    <head>
      <meta charset="UTF-8">
      <title>Your IP has been blocked</title>
   </head>
   <body>
      <h1>Your IP has been blocked</h1>
      <p>Your IP <?php echo $_SERVER["REMOTE_ADDR"]; ?> has been blocked because it is associated with a region in <?php echo $country_fullName; ?>.<br>If You think You see this message erroneously, please <a href="mailto:webmaster@example.org" title="contact the webmaster">contact the webmaster</a>!</p>
    </body>
  </html>

  <?php
  die(); 
}
?>
Die automatische Einbindung erledigst du mit einer Zeile in der .htaccess: php_value auto_prepend_file "./ip_geocheck.php"
 
Zuletzt bearbeitet:
Ich nehme an, das wäre dann besser, weil sonst ja jemand die Weiterleitung abschalten könnte.
Naja, es würde ihm wenig bringen, weil er dann nur eine blanke Seite sieht. Das wichtige ist, auf keinen Fall die(); zu vergessen, damit die weitere Skriptausführung verhindert wird.
 
Zuletzt bearbeitet:
Hi zusammen, ich benutze diesen hier aktiv: IP-2-Country ... die Daten liegen in meiner eigenen DB und machen daher eine externe Anfrage an andere Anbieter nicht erforderlich.

Das Projekt stellt folgende Informationen:
Code:
Array(
    [IP_FROM] => 3585376256
    [IP_TO] => 3585384447
    [REGISTRY] => RIPE
    [ASSIGNED] => 948758400
    [CTRY] => PL
    [CNTRY] => POL
    [COUNTRY] => POLAND
    [IP_STR] => 213.180.138.148
    [IP_VALUE] => 3585378964
    [IP_FROM_STR] => 127.255.255.255
    [IP_TO_STR] => 127.255.255.255
)

Im Projekt limitiere ich auf "CNTRY" - mein Projekt ist mit Abfragen auf DEU, AUT und CHE limitiert (aufgrund Performance, da ich echt Knallkörper hatte, die Scans in Fernost gemacht hatten).

Aber das ist sehr zuverlässig wie schnell - mit ein wenig Aufwand (Daten manchmal zu aktualisieren). ;)

Beste Grüße
 
Natürlich kann man auch direkt die in PHP eingebaute Funktion PHP: GeoIP - Manual nutzen. Bei shared hosting gibt es da aber oft Probleme mit der erforderlichen lokalen Datenbank.

Ich glaube, da muss ich mich erst einlesen!

Das ganze soll bei mir aber doch recht zeitnah umgesetzt werden und einfach nur den Abuse etwas zurück schrauben; ganz wird dies natürlich nicht gelingen (Gründe wurden genannt).
 
VPNs würden IPs aus dem privaten IP-Bereich zuweisen, quasi so als ob man in einem Firmebnetzwerk ist.
Nur zur Klärung: der VPN vergibt an denjenigen, der sich einwählt ein private IP, über die er dann mit dem VPN und dem Netzwerk, das dahinter sitzt, reden kann. Der VPN redet dann aber mit der Außenwelt ganz normal mit einer öffentlichen IP (wenn der VPN als Relay ausgelegt und betrieben wird). Ist genauso wie mit deinem Router zu Hause. Deswegen ja der Name: virtual private network.
 
Also zumindest bei Cyberghost und hide.me konnte ich es auch beobachten, das, wenn ich mit aktivem VPN auf wieistmeineip gehe, die angezeigte IP vorn drei Stellen hat, insofern habe ich dem Kollegen geglaubt.
 
Zuletzt bearbeitet:
Also zumindest bei Cyberghost und hide.me konnte ich es auch beobachten, das, wenn ich mit aktivem VPN auf wieistmeineip gehe, die angezeigte IP vorn drei Stellen hat
Das kann schon sein, dass einige davon 3 Stellen haben. Aber dennoch stimmt die Aussage nicht... Als Beispiel nehme ich gleich mal CyberGhost: 67.221.255.55 ist beispielsweise einer der Server in New York.
 
Das kann schon sein, dass einige davon 3 Stellen haben. Aber dennoch stimmt die Aussage nicht... Als Beispiel nehme ich gleich mal CyberGhost: 67.221.255.55 ist beispielsweise einer der Server in New York.

Da werde ich mir den Kollegen, wenn ich ihn bei Gelegenheit wieder mal spreche, mal zur Brust nehmen und ihn mal darauf ansprechen.

Aber nochmal eine andere Frage, kennst du (oder sonst jemand) eine Api, die mir auch den Anbieter zu einer IP liefert?
 
Zurück
Oben