User nur aus DE, AUT und CH zulassen (htaccess)

DjMG

Lieutenant
Registriert
Dez. 2006
Beiträge
621
Hallo!

Auf einer Website habe ich ein Verzeichnis angelegt, worin ein php-File liegt.
Dieses soll nur aus Deutschland, Österreich oder der Schweiz aufrufbar sein.
Habe schon lange gegoogelt und bin auf die Lösung mit einem .htaccess File gekommen.

Habe bei diesem Generator: http://www.ipaddresslocation.org/ip_ranges/get_ranges.php auch alle IP-Ranges generieren lassen und in meine htaccess eingefügt. Diese sieht nun so aus:
Code:
order deny,allow
deny from all

allow from 2.20.182.0 - 2.20.182.255
allow from 2.21.88.0 - 2.21.93.255
allow from 2.21.96.0 - 2.21.111.255
... 18.000 weitere Zeilen ...

Leider sperrt die Datei nun alle Besucher, auch welche die in den Allow-Ranges drin sind. Warum?

Beste Grüße
 
Ich kenne mich mit htaccess nicht sonderlich aus. BEi dir steht jedoch "order deny,allow" und als erste Anweisung kommt dann "deny from all". Das bedeutet er filtert zuerst die raus, die nicht rauf dürfen, was aber bereits ALLE sind. Ich würde also die Reihenfolge ändern und "order allow,deny" probieren.
 
Wie sicher muss das ganze denn sein?

Ich würde das eher über die Ländereinstellung des Browsers machen: $_SERVER['HTTP_ACCEPT_LANGUAGE']
 
Back2Roots schrieb:
Ich würde das eher über die Ländereinstellung des Browsers machen: $_SERVER['HTTP_ACCEPT_LANGUAGE']

Was man einfach umgehen kann.
 
@ MrEisbaer
Ist nicht so als könnte man nicht einfach per VPN sich eine andere IP Adresse "besorgen". Ist zwar ein Stückchen aufwändiger als die Spracheinstellungen ändern, aber dennoch einfach und schnell zu erledigen. Der Sprachfilter wäre wenigstens eine Zeile und keine 18k+.

Verarbeitet müssen diese 18k Zeilen vom Server auch noch - und das vermutlich bei jedem Zugriff.
 
Turas schrieb:
deny from all erst am Ende des Files
Klappt nicht. Auch das umdrehen von dem "order"-Statement bringt nichts.

@andi_0:
Wie würde dann das gesamte Script aussehen für die 3 Länder?
 
In PHP als Beispiel:
Code:
if ($_SERVER["HTTP_ACCEPT_LANGUAGE"] == "de" || $_SERVER["HTTP_ACCEPT_LANGUAGE"] == "de-at" || $_SERVER["HTTP_ACCEPT_LANGUAGE"] == "de-ch") {

 // hier wird die Seite angezeigt
} else {

// hier nicht, z.b.: return 0

}
 
Zuletzt bearbeitet: (kleiner Tippfehler)
Selber gemacht habe ich es noch nicht.

Hier (http://www.php.de/server-hosting-und-workstations/56762-htaccess.html) hab ich folgendes als Beispiel gefunden:
# Sprachweiterleitung
RewriteCond %{HTTP:Accept-Language} ^de [NC]
RewriteRule ^$ /index-de.html [R=301]
RewriteCond %{HTTP:Accept-Language} ^en [NC]
RewriteRule ^$ /index-en.html [R=301]
# Default-Sprache
RewriteRule ^$ /index-en.html [L,R=301]

Du müsstest, denk ich, auf de, de-de, de-at und de-ch überprüfen. Ist es eines der Sprachen, leite den User auf die eigentliche Seite weiter. Ist sie es nicht, leite sie auf eine andere Seite weiter.
 
andy_0 schrieb:
Ist nicht so als könnte man nicht einfach per VPN sich eine andere IP Adresse "besorgen". Ist zwar ein Stückchen aufwändiger als die Spracheinstellungen ändern, aber dennoch einfach und schnell zu erledigen.

Das ist mir auch klar, aber generell ist die Frage, ob IP Sperren in Konjunktur Zeiten von Proxys Sinn machen bzw. den Aufwand rechtfertigen.

Einen Proxy kann man dank FoxyProxy schnell einrichten und die IP Sperre ist somit wirkungslos. Ebenso schnell kann man halt auch die Ländereinstellungen im Browser ändern.

IP Sperren würden erst Sinn machen, wenn auch geprüft wird ob ein Proxy vorgeschaltet ist, z.B. anhand des Ports wie 8888, 2138, 8080 etc.
 
@ MrEisbaer
Oki ;). Wollte nur hinweisen, dass es eben alles leicht zu umgehen ist. Es ist natürlich so, dass man auf Basis der IP filtern muss, wenn man zwingend nach Geografischen gebieten filtern MUSS (z.B. aus rechtlichen Gründen).
 
Ich glaube das Format der allow-Directiven ist so nicht möglich. Benutz mal das CIDR-Format.
 
Also diese Lösung

Code:
<?php

if ($_SERVER["HTTP_ACCEPT_LANGUAGE"] == "de" || $_SERVER["HTTP_ACCEPT_LANGUAGE"] == "de-at" || $_SERVER["HTTP_ACCEPT_LANGUAGE"] == "de-ch" || $_SERVER["HTTP_ACCEPT_LANGUAGE"] == "de-de") {
 
 echo ('Du hast die richtige Sprache');
 
} else {
 
 echo ('Du hast die falsche Sprache');
 
}

?>

... klappt nicht, obwohl mein PC auf Deutsch eingestellt ist.
Warum??
 
Weil $_SERVER['HTTP_ACCEPT_LANGUAGE'] für Deutschland nicht nur 'de' speichert sondern (bei mir z.b.) 'de-de,de;q=0.8,en-us;q=0.5,en;q=0.3'.
 
Um dir mal genau anzuschauen, was in der $_SERVER["HTTP_ACCEPT_LANGUAGE"] steht, mach ein echo $_SERVER["HTTP_ACCEPT_LANGUAGE"]
 
echo liefert:
Code:
de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4

Also was kann ich tun?
 
Ich kenne mich leider nicht sooo gut in PHP aus und kann dir leider kein funktionierenden Code liefern.

Du hast prinzipiell zwei Möglichkeiten. 1. wäre ein Wildcardsuche ala ="*de*" und 2. wäre der Aufbau eines Arrays auf Basis von ; d.h. du trennst die Elemente nach Semikolon und gehst das Array dann nach den gesuchten Einträgen durch. Du musst jedoch aufpassen, da du u.a. noch nach , Trennen musst, da du Einträge hast wie "de-DE,de" und "q=0.6,en".
 
Okay, das klingt plausibel - aber leider bin ich noch weniger PHP-Programmierer wie du,
d.h. ich muss auf die Antwort eines Experten warten :)
 
Habs:
Code:
<?php
 list($first) = explode(';', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
 $languages = explode(',', $first);
 
 var_dump($languages);
 
 if(count(array_intersect(Array('de', 'de-de'), $languages)) > 0)
 {
  echo 'Sprache OK';
 } 
 else
 {
  echo 'Sprache falsch';
 }

?>
 
Zurück
Oben