IP-Sperre
Shadow
- perl
Problem:
Ich brauche eine IP-Sperre und User-Sperre die auf 6 Stunden begrenzt ist, jedoch habe ich das Problem, das bei der IP-Sperre die Datei immer größer und größer wird, jetzt hätte ich eigentlich gerne ne Antwort auf folgende Frage:
Wie bastele ich am besten eine IP- und User-Sperre in PERL???
Falls ihr mir antworten solltet, dann bitte ich um einen Code, weil ich wenn ihr mit irgendwelchen Includes etc. um euch wirft das ganze so wie so nicht verstehe.
Danke schon mal im Voraus
Na da hast Du aber Glück!
Problem:
Ich brauche eine IP-Sperre und User-Sperre die auf 6 Stunden begrenzt ist, jedoch habe ich das Problem, das bei der IP-Sperre die Datei immer größer und größer wird, jetzt hätte ich eigentlich gerne ne Antwort auf folgende Frage:Wie bastele ich am besten eine IP- und User-Sperre in PERL???
Lösung siehe Link
http://perlbase.xwolf.de/cgi-bin/perlbase.cgi?display=16&id=15
(steht weiter unten , Stichwort Mehrfachposting)
Viele Grüße, Rolf
Gibt es ne Möglichkeit das ohne ne DB also mit einer Datei zu machen und wie müsste ich das ganze dann anbinden, verstehe aber leider den Code hinterm Link nicht, kannst du mir das mal erklären ???
Gibt es ne Möglichkeit das ohne ne DB also mit einer Datei zu machen und wie müsste ich das ganze dann anbinden, verstehe aber leider den Code hinterm Link nicht, kannst du mir das mal erklären ???
Klar! Ich erkläre mal den Code.
Das ist doch ganz einfach.
Ich nehme die Ip- Address die der UserAgent liefert als Schlüssel und schreibe zu diesem Schlüssel den Zeitstempel als Wert in eine Berkeley - Datenbank.
Eine Berkeley - Datenbank ist eine Daten - Bank wo ich mit einem Schlüssel reingehe und mit diesem Schlüssel den dazugehörigen Wert wieder auslesen kann. Oder auch schreiben. Thats all.
Mehr zu Berkeley DB's auf:
http://perlbase.xwolf.de/cgi-bin/perlbase.cgi?display=16&id=9
Gruss, Rolf
Also, ich mache mir so eine Darkley Datenbank, die ich auf meinem Spacehoster auch einfach so erzeugen kann brauche also nicht MySQL und dann benutze ich den Skript der hinter dem ersten Link steht und baue den in meinem Skript ein, alles schön und gut, aber ich hab keine Ahnung von Datenbanken dieses Typens ;-)
Also geht es so wie oben gasagt oder nicht? Und wie soll das überhaupt klappen ????
Also, ich mache mir so eine Darkley Datenbank, die ich auf meinem
Berkeley
Also, ich mache mir so eine Darkley Datenbank, die ich auf meinem
Berkeley
Ok ok Berkeley, wie der Nama ist ist ja auch egal, ich versteh den Typ Datenban ktrotzdem nicht! Datenbanken selber bekomm ich ja mit Access hin, aber das mit der SQL-Abfrage wird dann schon wieder nichts, deswegen muss ich wissen wie der Skript selber aussieht, damit ich einen Skript fertig stellen kann. Könntest du mir freundlicher Weise diesen Codeschnipsel zur Abfrage der Ip erstellen, für die User überprüfung geschieht dann ja das gleiche nur mit andern Variablen und anderen NAmen der DB.
Hoffe du machst das für mich bitte bitte!
Danke schon mal im Vorraus
Ok ok Berkeley, wie der Nama ist ist ja auch egal, ich versteh den Typ Datenban ktrotzdem nicht! Datenbanken selber bekomm ich ja mit Access hin, aber das mit der SQL-Abfrage wird dann schon wieder nichts, deswegen muss ich wissen wie der Skript selber aussieht, damit ich einen Skript fertig stellen kann. Könntest du mir freundlicher Weise diesen Codeschnipsel zur Abfrage der Ip erstellen, für die User überprüfung geschieht dann ja das gleiche nur mit andern Variablen und anderen NAmen der DB.
Du hast dir nicht ein Stückchen durchgelesen was er dir gezeigt hat?
Du brauchst keine SQL Abfrage, mit den DB Typ geht alles von alleine indem du auf ein Hash zugreifst.
Struppi.
Helo Struppi,
Du hast dir nicht ein Stückchen durchgelesen was er dir gezeigt hat?
Hat er nicht. Danke für Dein Feedback.
Und siehe Betreff ;-)
Viele Grüße
Rolf
Hmm habe selbst ein Forum
aber eine IP Sperre, sowas...
dabei tut's auch eine ganz normale Abfrage ob jemand seinen Namen richtig schreiben kann.
Wenn er das nicht fertig bringt, sagt mein script:
sorry, ich schaffs einfach nicht...
Eigentlich braucht es eine IQ-Sperre
Aber manchmal bin ich auch froh, wenn ich so alle drei Monate mal von Hand testen darf, ob meine Löschfunktion noch funktioniert.
Und dann bin ich unheimlch stolz auf mein Script.
Beat
Hallo,
Hat er nicht....
Und siehe Betreff ;-)
@Rolf: Bedenke, dass fuer viele eine Datenbank "so'n Stueck Software, dass man installieren muss um dann mit so'n SQL-Zeuchs irgendwelche Sachen reinspeichern und rauslesen kann"-Ding ist. Vielen bleibt verborgen , dass im Gegensatz zu dieser landlaeufigen Annahme auch einfache Textdateien, beispielsweise /etc/hosts oder /etc/passwd, bereits Datenbanken sind.
@Shadow: Falls das noch nicht klar geworden ist, BerkleyDB' sind Datenbanken, die _nicht_ mit SQL bearbeitet werden und fuer die Du, wenn Du Perl verwendest, auch keine zusaetzliche Software installieren musst um damit arbeiten zu koennen.
Grüße
Klaus
Hi,
Könntest du mir freundlicher Weise diesen Codeschnipsel zur Abfrage der Ip erstellen, für die User überprüfung geschieht dann ja das gleiche nur mit andern Variablen und anderen NAmen der DB.
Du hast dir nicht ein Stückchen durchgelesen was er dir gezeigt hat?
Doch hate er scheint's, nur ist das wohl dsa Problem ;-)
Du brauchst keine SQL Abfrage, mit den DB Typ geht alles von alleine indem du auf ein Hash zugreifst.
Meist wird aber nur MySQL als DB bei den Providern angeboten, deshalb ist seine Frage durchaus berechtigt.
Zumindest habe ich es so verstanden
so short
Christoph Zurnieden
Hi,
Datenbanken selber bekomm ich ja mit Access hin,
Ich befürchte _damit_ hast Du selbst den sehr verehrten Kollegen Rolf ... ähem ... irritiert ;-)
aber das mit der SQL-Abfrage wird dann schon wieder nichts, deswegen muss ich wissen wie der Skript selber aussieht, damit ich einen Skript fertig stellen kann. Könntest du mir freundlicher Weise diesen Codeschnipsel zur Abfrage der Ip erstellen, für die User überprüfung geschieht dann ja das gleiche nur mit andern Variablen und anderen NAmen der DB.
Hoffe du machst das für mich bitte bitte!
Nein, sowas gibt's hier nicht. Aber eine Erklärung des Vorgangs in iplock() hier http://perlbase.xwolf.de/cgi-bin/perlbase.cgi?display=16&id=15 kann ich natürlich gerne erledigen:
(Ich erlaube mir mal ein C&P, hoffe das geht i.O.)
my $locktime = 20;
sub iplock{
my $ip = $ENV{'REMOTE_ADDR'};
my $ctime = time;
my $diff = $ctime - $lockdb{$ip};
if($diff > $locktime){
$lockdb{$ip} = $ctime;
return;
}
else{
print qq(
<p>Bitte keine Mehrfachpostings.
$index
);
exit;
}
return;
}
so short
Christoph Zurnieden
So hier mal der Codeschnipsel, den ich jetzt geproggt habe, doch leider hab ich ein Problem, wenn ich den Skript aufrufe, dann sollte er ja eigentlich die IP und die Zeit in die DB schreiben, doch wenn ich ihn in Binnen 20 sek wieder aufrufe, dann, funktioniert das ganze nicht so wie es soll!
Woran liegt es
#/usr/bin/perl
use DB_File;
use strict;
my $dbfile = '/tmp/lockip.db';
my %lockip;
tie(%lockip, 'DB_File', $dbfile, O_RDWR|O_CREAT, 0777) or die "Can't tie %data with file $dbfile";
my $locktime = 20; # Sekunden
#pruefen ob eine IP Adresse gelockt ist und ggf. locken
my $cip = $ENV{'REMOTE_ADDR'};
my $ctime = time;
my $timediff = $ctime - $lockip{$cip};
if ($timediff > $locktime)
{
print "Du Hast die Erlaubniss wieder abzustimmen";
$lockip{'$cip'} = $ctime;
}
else
{
print "Du hast keine Erlaubniss noch einmal abzustimmen";
}
untie %lockip;
exit;
Hi,
So hier mal der Codeschnipsel, den ich jetzt geproggt habe, doch leider hab ich ein Problem, wenn ich den Skript aufrufe, dann sollte er ja eigentlich die IP und die Zeit in die DB schreiben, doch wenn ich ihn in Binnen 20 sek wieder aufrufe, dann, funktioniert das ganze nicht so wie es soll!
Bitte um genaue Fehlerbeschreibung, da ich eigentlich keinen Fehler entdecken kann. Allerdings habe ich das auch nicht getestet, vielleicht ist's nur eine Kleinigkeit, ein Typo o. ä., deshalb meine Frage nach der genauen Fehlerbeschreibung.
Außerdem bin ich auch nicht gerade _der_ Perlguru! ;-)
Lock_DB binden
my $dbfile = '/tmp/lockip.db';
my %lockip;
tie(%lockip, 'DB_File', $dbfile, O_RDWR|O_CREAT, 0777)
777 ist aber nicht gerade die feine Art, oder? ;-)
Das folgende ist eigentlich als getrennte Funktion besser, wie auch von Rolf implementiert.
#pruefen ob eine IP Adresse gelockt ist und ggf. locken
my $cip = $ENV{'REMOTE_ADDR'};
my $ctime = time;
Beim erstem Aufruf ist in der DB natürlich nichts drin, wie da Perl drauf reagiert, insbesondere was dann in $timediff ist mußt Du mal nahchscauen (print hilft da ausnahmsweise ganz gut ;-)
my $timediff = $ctime - $lockip{$cip};
if ($timediff > $locktime)
{
print "Du Hast die Erlaubniss wieder abzustimmen";
Ah! Die Anführungsstriche sind hier nicht ganz richtig! Lag's evt daran?
$lockip{'$cip'} = $ctime;
so short
Christoph Zurnieden
Ok, es lag an den ''
Jetzt funktionierts lokal, um das ganze auf meinem Webspace laufen zu lassen, da muss ich das noch mal mit dem Hoster absprechen
So jetzt funktioniert es wie es soll