Anzahl der Zugriffe pro IP in Zeit X beschränken

Hier können Probleme und alles andere in Deutscher Sprache gelöst werden.
Freudi
Regular
Posts: 97
Joined: Thu Nov 23, 2006 6:29 am
Contact:

Anzahl der Zugriffe pro IP in Zeit X beschränken

Post by Freudi »

Hi,

ich bzw. meine (noch existierende) kleine Site hat seit der Ankündigung der Schließung der Site mit diversen Webkopierern (HTTrack & Co.) zu kämpfen (rund 200 Zugriffe in einer Minute und damit auch real mehrere Tausend innerhalb einer Stunde von der selben IP). Dass derlei Traffic und den (in dem Fall Shared) Server Performance kostet, interessiert die Kopierer bekanntermaßen ebenso wenig, wie Urheberrechte. Das Ausschließen der (gefälschten) User-Agents über die .htaccess gleicht einem Hase und Igel-"Spiel", zumal die Maßnahmen nur im Nachhinein (Zugriffsmöglichkeit auf die Logs nur alle 24 Stunden) greifen und auch "reguläre" User-Agents zum Einsatz kommen "könnten".

Ich suche also nach einer wirkungsvolle(re)n Möglichkeit, die Zugriffe von einer IP-Adresse in einem bestimmten Zeitraum beschränken zu können - was nebenbei auch ein paar DoS-Attacken vermeiden helfen könnte.

Während der Suche, wie sich dies realisieren ließe, bin ich auf http://technologie4web.de/automatisches ... erhindern/ gestoßen. Ja, ich habe die Kommentare dort gelesen, kann die Gegenargumente zur Sinnhaftigkeit auch verstehen, suche aber aktuell nach einer solchen Lösung für den konkreten Anwendungsfall. Nur, wo baue ich das wie in s9y in welcher Datei ein? Und wäre es nicht ggf. doch auch eine Überlegung wert, dies generell als Option im Spamschutz-Plugin einzubauen?

TIA,
Freudi
Lux
Regular
Posts: 764
Joined: Fri Aug 12, 2005 4:36 pm
Location: Grüt, Zürich, Switzerland
Contact:

Re: Anzahl der Zugriffe pro IP in Zeit X beschränken

Post by Lux »

Freudi wrote:Ich suche also nach einer wirkungsvolle(re)n Möglichkeit, die Zugriffe von einer IP-Adresse in einem bestimmten Zeitraum beschränken zu können - was nebenbei auch ein paar DoS-Attacken vermeiden helfen könnte.
Hast Du Zugriff auf den Server?

Gruss

Dirk
Freudi
Regular
Posts: 97
Joined: Thu Nov 23, 2006 6:29 am
Contact:

Re: Anzahl der Zugriffe pro IP in Zeit X beschränken

Post by Freudi »

Lux wrote:Hast Du Zugriff auf den Server?
Nope, ist ein Shared Server (von/bei allinkl), also pures "Webhosting".

Bye,
Freudi
Freudi
Regular
Posts: 97
Joined: Thu Nov 23, 2006 6:29 am
Contact:

Re: Anzahl der Zugriffe pro IP in Zeit X beschränken

Post by Freudi »

Keine Idee mehr? Schade.

Bye,
Freudi
garvinhicking
Core Developer
Posts: 30022
Joined: Tue Sep 16, 2003 9:45 pm
Location: Cologne, Germany
Contact:

Re: Anzahl der Zugriffe pro IP in Zeit X beschränken

Post by garvinhicking »

Hi!

Grundsätzlich ist so ein Ansatz keine wirklich gute Lösung; mansollte immer eine ebene höher als PHP ansetzen, also Apache .htaccess oder sogar iptables.

Die von dir verlinkte PHP-Lösung kannst du grundsätzlich ganz am anfang der serendipity_config_local.inc.php einbauen, dann wirds immer aufgerufne. Sauberer wäre ein eigenes Ereignis-Plugin, aber den aufwand würde ich da jetzt nicht treiben.

Grüße,
Garvin
# Garvin Hicking (s9y Developer)
# Did I help you? Consider making me happy: http://wishes.garv.in/
# or use my PayPal account "paypal {at} supergarv (dot) de"
# My "other" hobby: http://flickr.garv.in/
Freudi
Regular
Posts: 97
Joined: Thu Nov 23, 2006 6:29 am
Contact:

Re: Anzahl der Zugriffe pro IP in Zeit X beschränken

Post by Freudi »

garvinhicking wrote:Grundsätzlich ist so ein Ansatz keine wirklich gute Lösung; mansollte immer eine ebene höher als PHP ansetzen, also Apache .htaccess oder sogar iptables.
Das ist mir auch klar, Garvin. Aber wenn es sich nunmal um einen Shared Server (Webhosting-Paket) handelt, der a) lediglich täglich für den Vortag einmal die LOGs heraus rückt und b) offenbar ab einer gewissen Größe(?) der .htaccess diese kommentarlos nicht mehr abarbeitet und c) natürlich keine Zugriffsmöglichkeit auf iptables bietet, dann bleibt in diesen konkreten Fällen nicht mehr viel übrig - zumal das Blockieren eines "Saugers" über die .htaccess anhand der IP-Adresse eh nur solange wirkt, bis er die Verbindung trennt und neu aufbaut (und die IP-Adresse auch erst am nächsten Tag festgestellt werden kann, Stichwort: ausschließlich tägliche LOGs).

Oder hättest Du noch eine andere Idee?

Für diejenigen, die sich nicht vorstellen können, wie so etwas aussieht, ein kleiner (verfremdeter) Auszug, was eine IP-Adresse beim "Kopieren" innerhalb einer Minute veranstaltet: [Edit: entfernt]
In dem Fall 133 Zugriffe in einer Minute mit 2.860.641 Bytes. Sieht auf den ersten Blick nach wenig aus. Wenn man aber bedenkt, dass diese "Kopiererei" teils >2 Stunden im selben Rhythmus (neben dem "normalen" Traffic) andauert und wirklich alles gesaugt wird, dann ist das Ganze schon deutlich weniger lustig.
Die von dir verlinkte PHP-Lösung kannst du grundsätzlich ganz am anfang der serendipity_config_local.inc.php einbauen, dann wirds immer aufgerufne.
Danke, werd ich versuchen.
Sauberer wäre ein eigenes Ereignis-Plugin, aber den aufwand würde ich da jetzt nicht treiben.
Brauch ich jetzt auch nicht mehr, andere Sites/Admins könnten möglicherweise damit glücklich(er) werden.

Bye,
Freudi
Freudi
Regular
Posts: 97
Joined: Thu Nov 23, 2006 6:29 am
Contact:

Re: Anzahl der Zugriffe pro IP in Zeit X beschränken

Post by Freudi »

Freudi wrote:
garvinhicking wrote:Die von dir verlinkte PHP-Lösung kannst du grundsätzlich ganz am anfang der serendipity_config_local.inc.php einbauen, dann wirds immer aufgerufne.
Danke, werd ich versuchen.
Done. Funktioniert soweit - bis auf den Umstand, dass die "PHP-Lösung" offenbar nicht funktioniert. Selbstverständlich habe ich ohnehin die Anzahl der "erlaubten" Zugriffe pro Minute ggü. dem "Vorschlag" in http://technologie4web.de/automatisches ... erhindern/ erhöht. Aber auch bei Überschreiten dieser Zugriffsanzahl kommt es nicht zu einer "Blockade". :(
Irgendjemand eine Idee, woran dies liegen könnte?
Sauberer wäre ein eigenes Ereignis-Plugin, aber den aufwand würde ich da jetzt nicht treiben.
Brauch ich jetzt auch nicht mehr
Korrektur Belege: Da ich mich gestern dann doch entschlossen habe, die kleine Site voerst weiter zu führen, wäre ich nach wie vor einer funktionierenden Lösung interessiert.

TIA und Gutes Neues,
Freudi
garvinhicking
Core Developer
Posts: 30022
Joined: Tue Sep 16, 2003 9:45 pm
Location: Cologne, Germany
Contact:

Re: Anzahl der Zugriffe pro IP in Zeit X beschränken

Post by garvinhicking »

Hi!

Also grundsätzlich kommt dein PRoblem ja dem eines "(D)DOS" schon halbwegs nahe, insofern sollte es da durchaus technische instanzen eines Webhosters geben, dir da unter die Arme zu greifen. Hast Du da nochmal freundlich angefragt? Oder gehts um 1&1? ;-)))

Anyhow.

In der PHP-Datei ovn dem bei dir genannten beispiel wird eine Syntax genutzt die nur mit MysQL5 funktioniert; hast Du das im Einsatz? Und sind in deiner sec_antikopie DB-Tabelle einträge drin? Ansonsten könnte man bei dem Autoren ggf. nochmals nachhaken. Ich habe leider im Hemdärmel gerade keine wirksame PHP-Lösung die dem nahe kommt die ich Dir geben könnte leider.

Evtl bringt eine dieser URLs dir etwas:

http://php.bigresource.com/Prevent-Rogu ... fcqB4.html
http://stackoverflow.com/questions/5411 ... g-hijacked

Grüße,
Garvin
# Garvin Hicking (s9y Developer)
# Did I help you? Consider making me happy: http://wishes.garv.in/
# or use my PayPal account "paypal {at} supergarv (dot) de"
# My "other" hobby: http://flickr.garv.in/
Freudi
Regular
Posts: 97
Joined: Thu Nov 23, 2006 6:29 am
Contact:

Re: Anzahl der Zugriffe pro IP in Zeit X beschränken

Post by Freudi »

garvinhicking wrote:Also grundsätzlich kommt dein PRoblem ja dem eines "(D)DOS" schon halbwegs nahe, insofern sollte es da durchaus technische instanzen eines Webhosters geben, dir da unter die Arme zu greifen. Hast Du da nochmal freundlich angefragt?
Habe ich bislang nicht (allinkl), zumal ich befürchte, dass es letztlich auf die "Empfehlung" hinausläuft, einen eigenen Server anzumieten.
In der PHP-Datei ovn dem bei dir genannten beispiel wird eine Syntax genutzt die nur mit MysQL5 funktioniert; hast Du das im Einsatz? Und sind in deiner sec_antikopie DB-Tabelle einträge drin?
Ja und ja. Es wäre mir auch wohler gewesen, dass es an dieser Stelle hakt, aber dem ist nicht so.
Ansonsten könnte man bei dem Autoren ggf. nochmals nachhaken.
Done. Die von ihm skizierte "Lösung" setzt allerdings selbst nicht ein. Scheint mehr eine "Machbarkeitsstudie" gewesen zu sein - positiv formuliert.
Das Problem, das sich hierbei stellt, wäre die feste "Verdrahtung" der IP-Adresse in der .htaccess. In Zeiten wie diesen, in denen immer noch dynamische IPs der Regelfall sind, möchte ich das so ungern einsetzen, denn die IP "gehört" beim nächsten Connect jemand anderem. Mir fehlt dabei also das "Verfallsdatum" der IP-Blockade.

Mir schwebt eher so etwas vor, wie der "IP-Block Intervall" in der serendipity_event_spamblock (mit optionaler Benachrichtigung des "Webmasters"). Ich dachte, die von technologie4web.de vorgestellte Lösung käme dem nahe. Aber sie funktioniert leider nicht :(

Danke fürs Mitgrübeln,
Freudi
garvinhicking
Core Developer
Posts: 30022
Joined: Tue Sep 16, 2003 9:45 pm
Location: Cologne, Germany
Contact:

Re: Anzahl der Zugriffe pro IP in Zeit X beschränken

Post by garvinhicking »

Hi!

Also was man bräuchte wäre je ein Script das man am Anfang von Serendipity einbindet. Das muss die aktuelle IP des Benutzers in eine Datenbanktabelle schreiben mit timestamp.

Direkt danach muss eine Abfrage gestartet werden, die die Summe aller Zugriffe berechnet, und zwar von der IP des aktuellen Aufrufs ($_SERVER['REMOTE_ADDR']). Und das muss innerhalb eines definierten Zeitfensters passieren. Und wenn diese Summe eine gewisse Zahl überschreitet, muss man das Script abbrechen.

Grob ungefähr so:

Code: Select all

<?php
// Nur eine Tabelle "blockliste" nötig, Felder: ip (varchar 32), zeit (bigint unsigned)
// datenbank connect
mysql_connect('localhost', 'user', 'passwort');
mysql_select_db('block');

// variablen
$max_summe = 30;
$max_zeit      = 3600; // Sekunden
$garbage        = 86400; // Sekunden

// erstmal alte einträge löschen
mysql_query("DELETE FROM blockliste WHERE zeit <= " . time()-$garbage);

// aktuellen eintrag setzen
mysql_query("INSERT INTO blockliste (ip, zeit) VALUES ('" . mysql_escape_string($_SERVER['REMOTE_ADDR']) . "', " . time() . ")");

// Summe für aktuelle IP holen
$r = mysql_query("SELECT SUM(zeit) AS summe FROM blockliste WHERE ip = '" . mysql_escape_string($_SERVER['REMOTE_ADDR']) . "' AND zeit >= " . time()-$max_zeit . " GROUP BY ip");
if (mysql_num_rows($r) > 0) {
  $dat = mysql_fetch_array($r, MYSQL_ASSOC);
  if ($dat['summe'] > $max_summe) {
    die('You have been terminated.');
  }
}
Das ist ungetestet, aber damit könnte man sicher herumspielen.

Grüße,
Garvin
# Garvin Hicking (s9y Developer)
# Did I help you? Consider making me happy: http://wishes.garv.in/
# or use my PayPal account "paypal {at} supergarv (dot) de"
# My "other" hobby: http://flickr.garv.in/
kleinerChemiker
Regular
Posts: 765
Joined: Tue Oct 17, 2006 2:36 pm
Location: Vienna/Austria
Contact:

Re: Anzahl der Zugriffe pro IP in Zeit X beschränken

Post by kleinerChemiker »

Beim holen der IPs sollte "AND zeit >= " . time()-$max_zeit" eigentlich überflüssig sein, da ja alle alten schon vorher gelöscht worden sind.
garvinhicking
Core Developer
Posts: 30022
Joined: Tue Sep 16, 2003 9:45 pm
Location: Cologne, Germany
Contact:

Re: Anzahl der Zugriffe pro IP in Zeit X beschränken

Post by garvinhicking »

kleinerChemiker wrote:Beim holen der IPs sollte "AND zeit >= " . time()-$max_zeit" eigentlich überflüssig sein, da ja alle alten schon vorher gelöscht worden sind.
Gelöscht wird ja nur alles was älter als ein Tag ist, ich wollte daher diese Zeit noch etwas enger fassen als die löschzeit. So hat man ein Protokoll was etwas länger geht, damit ma die Anzahlen etwas besser kontrollieren kann...?

Grüße,
Garvin
# Garvin Hicking (s9y Developer)
# Did I help you? Consider making me happy: http://wishes.garv.in/
# or use my PayPal account "paypal {at} supergarv (dot) de"
# My "other" hobby: http://flickr.garv.in/
kleinerChemiker
Regular
Posts: 765
Joined: Tue Oct 17, 2006 2:36 pm
Location: Vienna/Austria
Contact:

Re: Anzahl der Zugriffe pro IP in Zeit X beschränken

Post by kleinerChemiker »

Ok, wobei die Frage ist, wozu? Ich würde dafür nach Möglichkeit HEAP als Tabelle nehmen und da sollte man dann möglichst nur das speicehrn, was man auch braucht.

Eines sollte aber auch klar sein, daß u.U. Suchmaschienen davon auch betroffen sind.
Freudi
Regular
Posts: 97
Joined: Thu Nov 23, 2006 6:29 am
Contact:

Re: Anzahl der Zugriffe pro IP in Zeit X beschränken

Post by Freudi »

Moin,

[quote="garvinhicking"]

Code: Select all

[...]
if (mysql_num_rows($r) > 0) {
[...]
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource :?

Um Suchmaschinen oder auch etwas -ähm- nervöse "normale" User möglichst nicht zu behindern, würde ich die Zugriffe auf 30 pro Minute beschränken. 30 Pro Stunde wären mir dann doch zu restriktiv.

Danke fürs Bosseln :)
Freudi
Post Reply