Shadow: IP-Sperre

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

  1. 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

    --
    KnowHow veröffentlichen statt patentieren!
    1. 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 ???

      1. 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

        --
        KnowHow veröffentlichen statt patentieren!
        1. 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 ????

          1. Also, ich mache mir so eine Darkley Datenbank, die ich auf meinem

            Berkeley

            --
            Millionen Deutsche können nicht richtig lesen.
            1. 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

              1. 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.

                1. 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

                  --
                  KnowHow veröffentlichen statt panieren!
                  1. 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

                  2. 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

                2. 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

              2. 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.)

                globale Variable, die einen Wert enthält,der später als Timeoutwert

                fungiert.

                my $locktime = 20;

                sub iplock{

                in REMOTE_ADDR ist dei IP des Abrufenden drin.

                Das ist im Falle von CGI in den Umgebungsvariablen enthalten

                Diese lassen sich mit $ENV{'UMGEBUNGSVARIABLE'} auslesen.

                in der Variablen $ip ist nun die IP des Kunden

                my $ip = $ENV{'REMOTE_ADDR'};

                time gibt die Zeit zurück und zwar in Sekunden seit dem 1.1.1970

                in der Variablen $ctime ist also die aktuelle, sekundengenaue Zeit drin

                my $ctime = time;

                Die Variable $lockdb ist der Anschluß zur Datenbank, $lockdb{$ip}

                fragt demnach das ab, was unter der IP als Schlüssel gespeichert

                ist. Wie man etwas später sieht, ist das ein Zeitstempel.

                Jetzt wird von der aktuellen Zeit die gepeicherte Zeit abgezogen

                und in der Variablen $diff abgelegt.

                my $diff = $ctime - $lockdb{$ip};

                Wenn nun die in $diff gespeichert Zahl größer ist als

                $locktime, also größer 20 Sekunden ist...

                if($diff > $locktime){

                ... wird die aktuelle Zeit in der DB unter der IP gespeichert ...

                $lockdb{$ip} = $ctime;

                ... und diese Funktion abgeschlossen.

                return;
                  }

                Wenn das aber nicht der Fall ist (z.B. der Kunde zweimal kurz (< 20

                Sekunden) hintereinander auf "Absenden" gecklickt hat) dann ..

                else{

                wird folgende Meldung ausgegeben ...

                print qq(
                      <p>Bitte keine Mehrfachpostings.
                      $index
                      );

                und abgebrochen (Ist das nicht ein _wenig_ brutal Rolf? ;-)

                exit;
                  }

                hier kann man eigentlich nicht ankommen,aber gibt wahrscheinlich

                sonst Fehlermeldungen.

                return;
                }

                so short

                Christoph Zurnieden

                1. 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;

                  Lock_DB binden

                  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";
                   }

                  hash Bindung aufheben und exit

                  untie %lockip;
                  exit;

                  1. 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

                    1. 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

                      1. So jetzt funktioniert es wie es soll