Alain: die variable für IP's?{'REMOTE_ADDR'}

sorry das ich so spät noch störe,
ich versuchs nun mit dem cgi da ich mit server confic sowieso kein
meister bin und natürlich auch nicht unbedingt mit den cgi's.
Dennoch versuch ich durch andere cgis und selfhtml seit gestern morgen
rauszufinden wie ich die variable finde für IP's(REMOTE_ADDR)
zum vergleichen einer liste (werd noch wahnsinnig).
Ok ich möchte es hier mal die variable schreiben:
$ip_now         = $ENV{'REMOTE_ADDR'};
$ip_ab = "64.2.240.1";
@ip_ac =~ split(/^\d+.\d+.\d+.\d+$/);
foreach $ip_ab (@ip_ac)
{
if ($ip_ab == $ip_now)
      {print "Content-type: text/html\n\n";
      print "your IP $ip_now was banned from this chat\n";}}

das problem ist dass nun der browser meldet "keine daten" oder so,
aber dafür kein error 500 meldet.
was ist daran falsch?
Wäre froh um einen Rat.
Gruss Alain

  1. Hallo,

    ich versuchs nun mit dem cgi da ich mit server confic sowieso kein
    meister bin und natürlich auch nicht unbedingt mit den cgi's.
    Dennoch versuch ich durch andere cgis und selfhtml seit gestern morgen
    rauszufinden wie ich die variable finde für IP's(REMOTE_ADDR)
    zum vergleichen einer liste (werd noch wahnsinnig).
    Ok ich möchte es hier mal die variable schreiben:
    $ip_now         = $ENV{'REMOTE_ADDR'};
    $ip_ab = "64.2.240.1";
    @ip_ac =~ split(/^\d+.\d+.\d+.\d+$/);

    Wozu dient hier die Zeile, ich komm da irgendwie nicht ganz mit.

    foreach $ip_ab (@ip_ac)
    {
    if ($ip_ab == $ip_now)

    Du hast hier Strings und keine Zahlen, also eq statt == .Verwendest du nicht -w und use strict ?

    {print "Content-type: text/html\n\n";
          print "your IP $ip_now was banned from this chat\n";}}

    Hmmm hier mal eine Möglichkeit :
    #!/usr/bin/perl -w

    use strict;
    my @gesperrte_ips = ('212.34.57.14','47.2.234.6','12.234.75.2','255.67.4.21','195.3.133.87','93.45.2.46');
    print "Content-type:text/html\n\n";
    foreach(@gesperrte_ips)  {
        if ($_ eq $ENV{'REMOTE_ADDR'})  {
        print "Deine IP $_ ist gesperrt !\n";
        }
    }

    1. Hallo,

      Guten tag,

      $ip_now         = $ENV{'REMOTE_ADDR'};
      $ip_ab = "64.2.240.1";
      @ip_ac =~ split(/^\d+.\d+.\d+.\d+$/);

      Muss man $ip_ab nicht splitten mit @ip_ac um die ip genau zu
      formulieren? Desshalb diese zeile.

      Wozu dient hier die Zeile, ich komm da irgendwie nicht ganz mit.

      foreach $ip_ab (@ip_ac)
      {
      if ($ip_ab == $ip_now)

      Die variable $ip_now wird benötigt noch für eine zweite funktion
      die aber eigentlich nichts mit der überprüfung von der liste zu tun hat.

      Du hast hier Strings und keine Zahlen, also eq statt == .Verwendest du nicht -w und use strict ?

      hab ich schon aber nützt mir nicht viel,da der browser nur
      "Software error:
      Execution of /homepages/16/d1234567/htdocs/temp1/indextest.cgi
       aborted due to compilation errors."meldet.
      Wie übrigens auch bei Deinem Beispiel. >>>>?

      {print "Content-type: text/html\n\n";
            print "your IP $ip_now was banned from this chat\n";}}

      Hmmm hier mal eine Möglichkeit :
      #!/usr/bin/perl -w

      use strict;
      my @gesperrte_ips = ('212.34.57.14','47.2.234.6','12.234.75.2','255.67.4.21','195.3.133.87','93.45.2.46');
      print "Content-type:text/html\n\n";
      foreach(@gesperrte_ips)  {
          if ($_ eq $ENV{'REMOTE_ADDR'})  {
          print "Deine IP $_ ist gesperrt !\n";
          }
      }

      Kann es sein dass wenn einmal ein fehler passiert ist der server nur noch dies meldet?
      Mein host ist bei puretec.
      Gruss vom Alain

      1. Hallo,
        Guten tag,

        $ip_now         = $ENV{'REMOTE_ADDR'};
        $ip_ab = "64.2.240.1";
        @ip_ac =~ split(/^\d+.\d+.\d+.\d+$/);
        Muss man $ip_ab nicht splitten mit @ip_ac um die ip genau zu
        formulieren? Desshalb diese zeile.

        Wozu willst du denn die IP in die einzelnen Teile zerlegen. Das verstehe ich nicht?

        foreach $ip_ab (@ip_ac)
        {
        if ($ip_ab == $ip_now)

        Die variable $ip_now wird benötigt noch für eine zweite funktion
        die aber eigentlich nichts mit der überprüfung von der liste zu tun hat.

        Kein Problem, dann fügst du eben $ip_now statt $ENV{'REMOTE_ADDR'} in meinem Script ein.

        Du hast hier Strings und keine Zahlen, also eq statt == .Verwendest du nicht -w und use strict ?
        hab ich schon aber nützt mir nicht viel,da der browser nur
        "Software error:
        Execution of /homepages/16/d1234567/htdocs/temp1/indextest.cgi
        aborted due to compilation errors."meldet.
        Wie übrigens auch bei Deinem Beispiel. >>>>?

        Doch, mein Bsp. funktioniert. Was steht den im Errolog ? Ich kenne Puretec nicht, vielleicht liegt es daran daß der Pfad zu Perl nicht stimmt (#!/usr/bin/perl). Aber schwer zu sagen, ohne zu wissen was im Errolog steht. Was zu beachten ist, das Script funktioniert natürlich nicht von der Eingabeaufforderung aus, da dort keine IP zurückgegeben wird.
        Natürlich kannst du jetzt auch hergehen, und rückfragen, ob eine IP ausgegeben wird.Ich wollte es im Bsp. nur vereinfacht darstellen.

        {print "Content-type: text/html\n\n";
              print "your IP $ip_now was banned from this chat\n";}}

        Hmmm hier mal eine Möglichkeit :
        #!/usr/bin/perl -w

        use strict;
        my @gesperrte_ips = ('212.34.57.14','47.2.234.6','12.234.75.2','255.67.4.21','195.3.133.87','93.45.2.46');
        print "Content-type:text/html\n\n";
        foreach(@gesperrte_ips)  {
            if ($_ eq $ENV{'REMOTE_ADDR'})  {
            print "Deine IP $_ ist gesperrt !\n";
            }
        }

        Kann es sein dass wenn einmal ein fehler passiert ist der server nur noch dies meldet?

        Nein, der Server raunzt nur, wenn wirklich ein Fehler darin vorkommt.

        $xNeTworKx.

        1. hallo $xNeTworKx,
          Super es funtzt,
          ich hatte vergessen die htaccess einzufügen jetzt gehts :-)
          Eine Frage der gesperrten Ip_liste hät ich noch,
          kann man da beliebig viele ip's in die liste einfügen oder gibts da
          eine begrenzung?
          Gruss vom Alain

          1. Hi,

            kann man da beliebig viele ip's in die liste einfügen oder gibts da
            eine begrenzung?

            Du kannst so viel da rein stopfen, bis der Speicher voll ist :)

            $xNeTworKx.

            1. Hi,

              hallo,
              hmmmmm,klingt ja gut :-)

              kann man da beliebig viele ip's in die liste einfügen oder gibts da
              eine begrenzung?

              wie ist das, könnte man auch einen teil der IP also z.B. '24.234'
              in die liste einfügen um grundsätzlich alle ,die mit IP24.234 beginnen auszugrenzen
              oder brauchts da noch einen code mehr?

              Du kannst so viel da rein stopfen, bis der Speicher voll ist :)

              $xNeTworKx.

              Gruss vom Alain

              1. Hi,

                wie ist das, könnte man auch einen teil der IP also z.B. '24.234'
                in die liste einfügen um grundsätzlich alle ,die mit IP24.234 beginnen auszugrenzen
                oder brauchts da noch einen code mehr?

                Eine Möglichkeit von vielen, wäre, daß du in der Schleife statt einem Vergleich, einen regulären Suchausdruck einfügst. Du vergleichst einfach die IP mit allen Strings im Array. wenn zB '234.23' ein Strings ist, wird jetzt auch eine IP, die beispielsweise 234.23.46.21 lautet ausgegrenzt :

                foreach(@gesperrte_ips)  {
                     if ($ENV{'REMOTE_ADDR'} =~ /^$_/)  {
                     print "Die IP $ENV{'REMOTE_ADDR'} ist gesperrt !\n";
                     }
                 }

                1. Hi,

                  wie ist das, könnte man auch einen teil der IP also z.B. '24.234'
                  in die liste einfügen um grundsätzlich alle ,die mit IP24.234 beginnen auszugrenzen
                  oder brauchts da noch einen code mehr?

                  Eine Möglichkeit von vielen, wäre, daß du in der Schleife statt einem Vergleich, einen regulären Suchausdruck einfügst. Du vergleichst einfach die IP mit allen Strings im Array. wenn zB '234.23' ein Strings ist, wird jetzt auch eine IP, die beispielsweise 234.23.46.21 lautet ausgegrenzt :

                  foreach(@gesperrte_ips)  {
                       if ($ENV{'REMOTE_ADDR'} =~ /^$_/)  {
                       print "Die IP $ENV{'REMOTE_ADDR'} ist gesperrt !\n";
                       }
                  }

                  Besten dank an Dich,
                  es klappt so genau wie ich es möchte :-)
                  Gruss vom Alain

  2. if ($ip_ab == $ip_now)
          {print "Content-type: text/html\n\n";
          print "your IP $ip_now was banned from this chat\n";}}

    Zwei Hinweise:

    1. Der Server ist darauf angewiesen, daß Du in _jedem_ Fall die Content-Type:-Kopfzeile ausgibst. Diese Zeile muß also über der if-Abfrage stehen.

    2. Kopfzeilen sollten mit \r\n enden, nicht \n. In Deinem Fall müsste es also

    print "Content-Type: text/html\r\n\r\n";

    heißen.

    Davon abgesehen könnte Dich eventuell eine Apache-Einstellung namens deny interessieren, mit der sich anhand einer einer ganzen Reihe Möglichkeiten von IPs über Domains bis zu sonstigen Sachen, auf exakte Treffer, teilweise Treffer oder auch mittels Mustern, Verbindungen aussperren lassen: http://httpd.apache.org/docs/mod/mod_access.html.
    Von der Last her eine ganze Ecke günstiger als extra Perl zu starten und obendrein wohl auch sicherer. Ob Du mod_access tatsächlich gebrauchen kannst, kommt allerdings drauf an, was genau Du vor hast.

    Gruß,
      soenk.e

    1. if ($ip_ab == $ip_now)
            {print "Content-type: text/html\n\n";
            print "your IP $ip_now was banned from this chat\n";}}

      Hallo soenk.e,

      Zwei Hinweise:

      1. Der Server ist darauf angewiesen, daß Du in _jedem_ Fall die Content-Type:-Kopfzeile ausgibst. Diese Zeile muß also über der if-Abfrage stehen.
      1. Kopfzeilen sollten mit \r\n enden, nicht \n. In Deinem Fall müsste es also

      print "Content-Type: text/html\r\n\r\n";

      heißen.

      Danke für die Hinweise :-)
      aber das cgi läuft (siehe weiter unten)

      Davon abgesehen könnte Dich eventuell eine Apache-Einstellung namens deny interessieren, mit der sich anhand einer einer ganzen Reihe Möglichkeiten von IPs über Domains bis zu sonstigen Sachen, auf exakte Treffer, teilweise Treffer oder auch mittels Mustern, Verbindungen aussperren lassen: http://httpd.apache.org/docs/mod/mod_access.html.
      Von der Last her eine ganze Ecke günstiger als extra Perl zu starten und obendrein wohl auch sicherer. Ob Du mod_access tatsächlich gebrauchen kannst, kommt allerdings drauf an, was genau Du vor hast.

      das mit deny,allow funktioniert eben leider nicht so ganz
      (vielleicht was falsch),sonst
      würde ich schon lieber dieses nehmen anstatt das cgi.
      Weiss auch nicht wesshalbes nicht geht.
      Was ich damit bezwecken möchte ist folgendes,
      von zeit zu zeit check ich die server log-datei ,wenn ich sehe das irgend
      ein Benutzer mit ner festen IP-adresse versucht in ein verzeichniss einzudringen
      wo er normalerweise nichts verloren hat,
      dann möchte ich ihm(durch seine IP-addresse)
      den zugang zu diesem verzeichniss
      sperren, falls er es trotzdem schafft mit password/username.
      Mit dem cgi schreibe ich diese Ip's nachträglich rein um somit eventuell
      diesem user,wenn er das nächstemal schafft in dieses verzeichniss einzudringen
      den zugang zu verweigern durch seine IP.

      gruss Alain

      Gruß,
        soenk.e

      1. Zwei Hinweise:

        1. Der Server ist darauf angewiesen, daß Du in _jedem_ Fall die Content-Type:-Kopfzeile ausgibst. Diese Zeile muß also über der if-Abfrage stehen.
        1. Kopfzeilen sollten mit \r\n enden, nicht \n. In Deinem Fall müsste es also
            print "Content-Type: text/html\r\n\r\n";
          heißen.

        Danke für die Hinweise :-)
        aber das cgi läuft (siehe weiter unten)

        Hab's mir jetzt nicht weiter angeschaut, aber Du solltest trotzdem auf diese beiden Punkte achten. Das es bei Dir läuft heißt ja noch lange nicht, daß es woanders läuft.

        Davon abgesehen könnte Dich eventuell eine Apache-Einstellung namens deny interessieren, mit der sich anhand einer einer ganzen

        das mit deny,allow funktioniert eben leider nicht so ganz
        (vielleicht was falsch),sonst
        würde ich schon lieber dieses nehmen anstatt das cgi.
        Weiss auch nicht wesshalbes nicht geht.

        Also an

        Order deny,allow
          Deny from 1.2.3.4

        kann man eigentlich nicht viel falsch machen :)

        Was ich damit bezwecken möchte ist folgendes,
        von zeit zu zeit check ich die server log-datei ,wenn ich sehe das irgendein Benutzer mit ner festen IP-adresse versucht in ein Verzeichniss einzudringen wo er normalerweise nichts verloren hat, dann möchte ich ihm(durch seine IP-addresse) den zugang zu diesem verzeichniss sperren

        Woher willst Du wissen, daß diese Adresse fest ist? Ich habe irgendwie Zweifel, ob das, was Du da vor hast, überhaupt halbwegs sicher greift und somit den Aufwand rechtfertigt.
        Falls Du tatsächlich einen Eindringling feststellst, solltest Du nicht die Adresse sperren, von der er kommt, sondern Namen und Passwort, die er benutzt hat. Ansonsten geht er einfach zu seinem Nachbarn und logt sich von da aus ein - da kannst Du Adressen sperren soviel Du willst.

        Gruß,
          soenk.e