Bestimmte Hostnamen auf Website blocken

tobi4

Member
Hi,

ich möchte wie folgt bestimmte Hostnames von meinen Webseiten ausschließen (nicht IP Adressen, da die Bots etc. meistens eh immer neue haben):

Dazu ist das als aller erstes in der jeweiligen php-Datei:
PHP:
$gethost = gethostbyaddr($_SERVER['REMOTE_ADDR']);
$banned = 'amazonaws.com';
$check1 = strpos($gethost, $banned);
$banned1 = 't-ipconnect.';
$check2 = strpos($gethost, $banned1);
if (($check1 OR $check2) === false) {
    echo "";
} else {
    echo 'Nicht erlaubt: '.$gethost.'';
	die;
}

Wenn ich nun die Website aufrufe, erhalte ich die entsprechende Meldung, sonst wird nichts geladen.

Da ich des öfteren Zugriffe von *.amazonaws.com bemerkt habe, wollte ich diesen Hostname nun auch aussperren, allerdings wurden erneute Zugriffe geloggt (nicht im access log, sondern durch ein Script auf der Website, welches sich nach dem die; im obigen Script befindet. Damit werden alle Zugriffe pro IP innerhalb 24h geloggt. Rufe ich selbst die Seite auf, sofern mein Hostname *.t-ipconnect.de im Script gesperrt wird, wird kein Eintrag durch mein Loggingscript vorgenommen.

Somit scheint es "amazonaws.com" möglich zu sein, das erste Script zu umgehen. Oder wie ist das möglich?

Eine Alternative wäre es natürlich, *.amazonaws.com in der htaccess zu sperren, aber sobald ich dort etwas anderes als eine IP Adresse nach "deny from" eintrage, werden die access-logs nicht mehr korrekt beschrieben (keine IP Adressen mehr, nur noch Hostnames).

Danke.
 
Dir ist aber schon klar, dass du damit jeden Telekom Kunden + alle Unternehmen oder Privatkunden die, wie z.B. Avira, die Server in der Amazon Cloud haben, aussperrst? Bau dir doch lieber ein Script, das IP's, die zu oft auf deine Seite zugreifen, oder was auch immer machen, in eine Datenbank einträgt.

Warum willst du diese Hosts denn überhaupt aussperren?
 
Last edited by a moderator:
Es gibt da verschiedene Server / Bots, die täglich mindestens einmal eine meiner Websites aufrufen.

Zum Beispiel amazonaws.com. Das mit t-ipconnect war nur ein Beispiel.

Wie bereits gesagt, wäre das ja über die htaccess kein Problem, funktioniert ja auch wenn ich da einfach deny from amazonaws.com eintrage, nur ab Zeitpunkt dieses Eintrages werden in meinen access_logs keine IP Adressen vorne mehr angezeigt, sondern nur noch Hostnames, warum das so ist - kA, habe damals keine Lösung gefunden, bin schon froh dass ich überhaupt drauf gekommen bin, dass es an der htaccess liegt. Sobald ich deny from 79.200. eintrage, werden die access logs korrekt beschrieben. Aber die Bots/Server haben immer unterschiedliche IPs...

So, und angenommen mein Host ist *.dip0.t-ipconnect.de, ich habe diesen mit dem Script ausgeschlossen und rufe die Seite auf, erhalte ich die Fehlermeldung und mein Seitenaufruf wird nicht in die DB eingetragen, weil das nächste Script ja aufgrund des die; gar nicht mehr geladen wird.

Habe ich nun (auch) amazonaws.com mit dem Script ausgeschlossen, erhalte ich dennoch erneute Zugriffe durch mein 2. Script welches Zugriffe loggt und in die DB einträgt, von *.amazonaws.com, genau so wie vorher auch. Da stell ich mir die Frage, wie ist das möglich?

Gruß
 
strpos liefert nicht zwingend einen Bool-Wert zurück. Daher wird es etwas schwieriger, das korrekt abzufangen. Ich würde eher so dran gehen:
PHP:
$gethost = gethostbyaddr($_SERVER['REMOTE_ADDR']);
$banned1 = 'amazonaws.com';
$check1 = strpos($gethost, $banned1);
$banned2 = 't-ipconnect.';
$check2 = strpos($gethost, $banned2);
if ($check1 !== FALSE OR $check2 !== FALSE) {
    exit('Nicht erlaubt: '.$gethost);
}
Sobald einer der beiden Strings gefunden wird, ist einer der Werte nicht falsch und de exit wird mit der entsprechenden Ausgabe durchgeführt. Sinnvollerweise kannst du noch einen 403-Status-Header vorweg schicken, daran erkennt dann auch der andere Bot, daß der bei dir nix zu suchen hat.
 
Also ich verstehe es nicht:

Letzter Zugriff mit IP: 95.108.244.251 - spider18.yandex.ru (09.09.2011 - 15:47)

Code:
$banned5 = 'yandex.ru'; 
$check5 = strpos($gethost, $banned5);

Wieso können die das Script umgehen?
 
Wenn die Namesauflösung zu lange braucht, kommt es zu einem Timeout und dein Ansatz funktioniert nicht mehr. Viele Bots lassen sich aber auch über ihren USER-AGENT identifizieren (wo du schon Yandex als Beispiel hast) und die würde ich dann auch direkt per .htaccess blocken - den Code findet man recht einfach bei Google.
 
Danke, dann werde ich das für die Bots so machen, bei bzw. für anonymouse.org klappt's auch so mit dem Script. ;)
 
Viele Bots lassen sich aber auch über ihren USER-AGENT identifizieren (wo du schon Yandex als Beispiel hast)
YANDEX -und die meisten anderen normalen Suchmachinen auch- respektiert die robots.txt
(Zumindest laut meinem Kenntnisstand, es gibt gegensaetzliche Berichte darueber aber Yandex selbst gibt an es zu respektieren)

Das ganze kannst du uebrigens auch mit Apache mod_access loesen was eleganter sein sollte;
Code:
Order Allow,Deny
Deny from yandex.ru
Deny from amazonaws.com
Deny from t-ipconnect.de

Gegen dein "Problem" mit Hostnamen in der Logfile hilft folgendes;
http://oneapachetipaday.blogspot.com/2007/03/log-both-ip-address-and-hostname.html
 
Last edited by a moderator:
Das ganze kannst du uebrigens auch mit Apache mod_access loesen was eleganter sein sollte;
Code:
Order Allow,Deny
Deny from yandex.ru
Deny from amazonaws.com
Deny from t-ipconnect.de
Ja, das weiß ich, nur wie bereits gesagt werden ab dem Zeitpunkt, ab dem ich hinter ein "deny from" etwas anderes als eine IP Adresse schreibe, in den access_logs vorne zu Beginn jeder Zeile keine IPs mehr gespeichert, sondern nur noch Hostnames.

Gegen dein "Problem" mit Hostnamen in der Logfile hilft folgendes;
http://oneapachetipaday.blogspot.com/2007/03/log-both-ip-address-and-hostname.html
Das ist Quatsch. Genau das habe ich damals alles ausprobiert und korrekt eingestellt, aber sobald eine .htaccess mit einem "deny from dip0.t-ipconnect.de" anstatt "deny from 79.200." gespeichert wird, stehen vorne im Log nur noch Hostnames (übrigens auch auf einem anderen Server). Keine Ahnung wieso... Und da ich öfter mal die Logs betrachte bzw. auch nach IPs dort suche, kann ich da keine Hostnamen drin gebrauchen.

Vielleicht kann jemand erklären, warum das eigentlich so ist? Würde mich natürlich auch mal interessieren.
 
Last edited by a moderator:
Vielleicht kann jemand erklären, warum das eigentlich so ist? Würde mich natürlich auch mal interessieren.
Das steht im verlinkten Artikel direkt unter "Note";
If HostnameLookups is set to On, then the server will try to determine the hostname and log it in place of the IP address.

Sobald du bei mod_access einen Hostname blockierst aktiviert er HostnameLookups um diesen vergleichen zu koennen und der oben zitierte Effekt tritt in Kraft.

Ein Ueberschreiben der Default-Wert bei Logs scheint tatsaechlich nicht zu klappen wie beschrieben, als Alternative erstellt man ein neues Logformat:
Code:
LogFormat "%a %l %u %t \"%r\" %>s %b" combined_custom
CustomLog "/var/customers/logs/ACCOUNT-access.log" combined_custom
 
Vielleicht kann jemand erklären, warum das eigentlich so ist? Würde mich natürlich auch mal interessieren.

Ich habe mal danach gesucht, weil es mich auch interessierte. Ich fand auf webmasterworld.com einen Beitrag von jdMorgan, in dem jener sagt, dass das mit der Basiskonfiguration des Webservers zu tun hat. Dies kann man wohl mit dem Apache Modul mod_log_config mit den "Format Strings" ein- bzw umstellen.

Viele Grüße
Thomas

PS: Absenden vergessen... 2. :rolleyes:
 
Last edited by a moderator:
Okay, danke euch. Werde mir das bei Gelegenheit nochmal anschauen und ausprobieren.

@d4f
Was meinst du mit "Ein Ueberschreiben der Default-Wert bei Logs scheint tatsaechlich nicht zu klappen"? Angenommen ich ändere jetzt das HostnameLookups auf Off, dann klappt das korrekte Speichern der Logs oder nun doch nicht?

Gruß
 
Angenommen ich ändere jetzt das HostnameLookups auf Off, dann klappt das korrekte Speichern der Logs oder nun doch nicht?
Sobald du einen Hostname in mod_access benutzt muss Apache die Hostnames aufloesen, egal ob es HostnameLookups on oder off hast.

Was meinst du mit "Ein Ueberschreiben der Default-Wert bei Logs scheint tatsaechlich nicht zu klappen"?
Apache's "combined" Logformat laesst sich nicht mit Bordmitteln ueberschreiben um eine andere Struktur zu liefern, man muss ein neues Logformat beisetzen (wie zB combined_custom in meinem Beispiel) um die Hostnames zu umgehen.
 
Ich würde es mit PHP so machen:
PHP:
<?php
$blocked_hostnames = array("hostname1.de", "hostname2.com", "hostname3.eu");
foreach($blocked_hostnames as $blocked_hostname)
{
    if(strpos($_SERVER['REMOTE_HOST'], $blocked_hostname) !=== FALSE)
    {
        echo 'Hostname blocked';
    }
}
?>
So kann man die Code-Zeile $blocked_hostnames beliebig erweitern.

Auch möchte ich in den Raum werfen, dass es den kostenlosen Anbieter "CloudFlare" gibt, mit welchem es möglich ist, den Server hinter einer Firewall zu verstecken und somit auch Bot-Netze abzuwehren.

Weiterführende Links:
de.PHP.net Sprachreferenz der vordefinierten Variable "$_SERVER".
de.PHP.net Funktionsreferenz Variablen- und typbezogenen Erweiterung "array".
de.PHP.net Funktionsreferenz der String-Funktion "strpos".
de.PHP.net Sprachreferenz der Kontrollstruktur "foreach".
 
Last edited by a moderator:
Back
Top