Gary: get-Daten einfach ausgeben

0 88

get-Daten einfach ausgeben

Gary
  • perl
  1. 0
    Beat (offline)
  2. 0
    Struppi
    1. 0
      Gary
      1. 0
        Struppi
        1. 0

          Perl-Problem erledigt!

          Gary
          1. 0
            Gary
            1. 0
              Struppi
              1. 0
                Gary
                1. 0
                  Struppi
                2. 0
                  Struppi
                  1. 0
                    Gary
                    1. 0
                      MudGuard
                      1. 0
                        Gary
                        1. 0
                          MudGuard
                          1. 0
                            Gary
                    2. 0
                      Struppi
                      1. 0
                        Gary
                        1. 0
                          Struppi
                          1. 0
                            Gary
                            1. 0
                              Gary
                              1. 0

                                Perl verstellt Link

                                Gary
                                1. 0
                                  Struppi
                                  1. 0
                                    Gary
                                    1. 0

                                      HTTP_HOST oder REMOTE_ADDR ?

                                      Gary
                                      1. 0
                                        Beat
                                        1. 0
                                          Gary
                                          1. 0

                                            Knifflige IF-Abfrage

                                            Gary
                                            1. 0
                                              Gary
                                              1. 0

                                                IF -Abfrage in IF -Abfrage?

                                                Gary
                                                1. 0
                                                  Alexander (HH)
                                                  1. 0
                                                    Gary
                                                    1. 0
                                                      Gary
                                                      1. 0

                                                        exit-Befehl ohne Wirkung!

                                                        Gary
                                                        1. 0
                                                          Struppi
                                                          1. 0
                                                            Gary
                                                            1. 0
                                                              Gary
                                                              1. 0
                                                                Struppi
                                                    2. 0
                                                      Struppi
                                                      1. 0

                                                        Verständnisfrage IF-Anweisung

                                                        Gary
                                                        1. 0
                                                          Gary
                                                          1. 0
                                                            Struppi
                                                            1. 0
                                                              Beat
                                                              1. 0
                                                                Gary
                                                                1. 0
                                                                  Gary
                                                                2. 0
                                                                  Beat
                                                                  1. 0
                                                                    Gary
                                                                    1. 0
                                                                      Beat
                                                                      1. 0

                                                                        Rest ok - LOCK_SH klemmt!

                                                                        Gary
                                                                        1. 0
                                                                          Gary
                                                                        2. 0
                                                                          Beat
                                                                          1. 0
                                                                            Gary
                                                                            1. 0
                                                                              Beat
                                                                              1. 0
                                                                                Gary
                                                                                1. 0
                                                                                  Beat
                                                                                  1. 0
                                                                                    Gary
                                                                                    1. 0
                                                                                      Beat
                                                                                      1. 0
                                                                                        Gary
                                                                                        1. 0

                                                                                          Array Ausgabe - wie?

                                                                                          Gary
                                                                                          1. 0

                                                                                            Alles gelöst - Fragen erledigt!

                                                                                            Gary
                                                                                          2. 0
                                                                                            Struppi
                                                                                          3. 0
                                                                                            Beat
                                                                                            1. 0
                                                                                              Gary
                                                                                              1. 0
                                                                                                MudGuard
                                                                                                1. 0
                                                                                                  Gary
                                                                                                  1. 0
                                                                                                    MudGuard
                                                                                                    1. 0

                                                                                                      Alles fertig - Danke für die Hilfe

                                                                                                      Gary
                                                              2. 0
                                                                Struppi
                                            2. 1
                                              Beat
                                      2. 0
                                        Alexander (HH)
                                        1. 0
                                          Gary
                                          1. 0
                                            Struppi
                                            1. 0
                                              Gary
                                        2. 0
                                          Gary
                                          1. 0
                                            Alexander (HH)
                                            1. 0

                                              Perl Sicherheit bei Daten über cgi

                                              Gary
                                              1. 0
                                                Alexander (HH)
                          2. 0
                            Beat
                            1. 0
                              Struppi
                            2. 0
                              Gary
                              1. 0
                                Beat
      2. 0
        Struppi
  3. 0
    Gary
    1. 0
      Struppi
  4. 0
    hotti
    1. 0
      Gary
      1. 0
        hottii
      2. 1
        hotti

Abend zusammen

Ich bin gerade an einem Gästebuch.
Das Formular ist in Ordnung und geht auch:
guestform.html

Der Perl-Code ist recht schlank gehalten:
-----------------------------------------
#!/usr/bin/perl -w

my $name;
my $text1;
my $text2;
my $text3;
my $regeln;
my $senden;

print $name;
print $text1;
print $text2;
print $text3;
print $regeln;
print $senden;
-----------------------------------------

Ich wollte nur mal sehen, was beim Script ankommt. Aber selbst wenn ich nur den Kopf des Perlscriptes verwende (Shebang) gibt der Server nach dem Drücken des "Senden"-Knopfes bereits eine Fehlermeldung aus: Internal Server Error....

Dabei ist noch nnicht einmal eine Zeile Code geschrieben. Die Shebang stimmt auf jeden Fall, denn das andere Script , welches den Inhalt per SSI liefert hat dieselbe Shebang.

Warum liefert mir der GuestBookManager.pl die Get Daten nicht auf den Clientbrowser aus?

Gruß Gary

  1. Warum liefert mir der GuestBookManager.pl die Get Daten nicht auf den Clientbrowser aus?

    weil du keinen  Header zum Content-type sendest.

  2. Ich wollte nur mal sehen, was beim Script ankommt. Aber selbst wenn ich nur den Kopf des Perlscriptes verwende (Shebang) gibt der Server nach dem Drücken des "Senden"-Knopfes bereits eine Fehlermeldung aus: Internal Server Error....

    Dabei ist noch nnicht einmal eine Zeile Code geschrieben. Die Shebang stimmt auf jeden Fall, denn das andere Script , welches den Inhalt per SSI liefert hat dieselbe Shebang.

    Diese Fehlermledung kann alles mögliche bedeuten. Was aber auffällt ist, dass dein Skript keinen HTTP header sendet und damit schon einen Fehler produziert.

    Ein Minimal Skript sähe so aus:

    #!/usr/bin/perl -w  
      
    use strict;  
    use CGI;  
      
    print CGI::header('text/plain');  
      
    print "Hallo!";
    

    Da du offensichtlich kein lokales Perl installiert hast, willst du dir vielleicht auch die Fehlermeldungen anzeigen lassen, sonst musst du bei jedem Problem hier fragen.

    #!/usr/bin/perl -w  
    BEGIN {  
    use CGI::Carp qw(fatalsToBrowser warningsToBrowser);  
    warningsToBrowser(1);  
    }  
    use strict;  
    use CGI;  
      
    print CGI::header('text/plain');  
    print "Hallo!";
    

    Struppi.

    1. Hi Struppi,

      Das steht im Script:
      --------------------------------------------------------------
      #!/usr/bin/perl -w

      ##############################################################

      GuestBookManager:      Version 1.00                        #

      Developed started in:  26.07.2010                          #

      Finished in:           XX.XX.XXXX                          #

      Programmed by:         Gary-Technologies                   #

      ##############################################################

      BEGIN {
      use CGI::Carp qw(fatalsToBrowser warningsToBrowser);
      warningsToBrowser(1);
      }
      use strict;
      use CGI;

      print CGI::header('text/plain');
      print "Hallo!";
      --------------------------------------------------------------

      Also dein Program 1:1 und trotdem die Fehlermeldung nach dem Absendeknopf. Habe Übrigens das Perl im ASCII Modus hochgeladen.

      Hatten wir nicht schon 2008 ein "or die" Problem oder "Fatals to Browser"-Problem? Mein Perl auf dem Server kennt das wahrscheinlich alles nicht.

      Gruß Gary

      1. Also dein Program 1:1 und trotdem die Fehlermeldung nach dem Absendeknopf. Habe Übrigens das Perl im ASCII Modus hochgeladen.

        Und es auch ausführbar gemacht?

        Hatten wir nicht schon 2008 ein "or die" Problem oder "Fatals to Browser"-Problem? Mein Perl auf dem Server kennt das wahrscheinlich alles nicht.

        Das muss es, sonst ist es nicht brauchbar. Das ist ein Modul das zum Standard gehört.

        Struppi.

        1. Hi Struppi,

          Und es auch ausführbar gemacht?

          *gumpf* nun, nachdem jetzt 755 eingestellt wurde, kann man auch hallo lesen!

          Mit anderen Worten: Jetzt ja...

          Das muss es, sonst ist es nicht brauchbar. Das ist ein Modul das zum Standard gehört.

          Gesegnet seihest du - denn ihr hab ja so recht gehabt - Amen!

          Jetzt kann ich wenigsten mal anfangen *g*

          Grüße und Danke

          Gary

          1. Hi Struppi,

            Kurze Zwischenfrage:
            Es geht um die mit Get übermittelten Daten (z. B. Zeile1->Feld=text1).
            Wenn der eingegebene Text Leerzeichen enthält (und das ist zu 99,9% so), dann macht mir das Get ein Pluszeichen in den Text.

            A)Ist das normal?

            B)Wenn ja kann ich es ja perlseitig durch ein &nbsp ersetzen und fertig ist die Leerstelle.

            Gruß Gary

            1. A)Ist das normal?

              Ja.

              B)Wenn ja kann ich es ja perlseitig durch ein &nbsp ersetzen und fertig ist die Leerstelle.

              use CGI;

              Aber was willst du mit  ?

              Struppi.

              1. Hi Struppi,

                Aber was willst du mit  ?

                An dem Problem bin ich schon fast vorbei. Ich lese den Get-Wert aus und ersetze alle "+" durch ein &nbsp. Aber dazu später mehr...

                Ich habe das hier:

                print "Hallo!";
                print "\n";
                print "Sie haben leider die Gästebuchregeln nicht bestätigt!";
                print "\n";
                print "Bitte klicken Sie auf die Zurückfunktion Ihres Browsers!";

                im Perl stehen. Und wie befürchtet ergibt dies beim Client im Browserfenster diese komischen Zeichen, die man sieht, wenn man die Codierung nicht richtig hat. (betrifft alle Umlaute wie äüö und so was...)

                Natürlich könnte ich im Perlscript die HTML-Entities verwenden und alles mit &pfläumlebäumle blablabla ausschmücken. Aber lieber wäre mir schon direkt das "ä" im Perlcode - wenn das geht.

                Alle anderen Seiten sind übrigens in meinem heißgeliebtem utf-8 codiert.

                Gruß Gary

                1. Natürlich könnte ich im Perlscript die HTML-Entities verwenden und alles mit &pfläumlebäumle blablabla ausschmücken. Aber lieber wäre mir schon direkt das "ä" im Perlcode - wenn das geht.

                  use CGI;!!!!!

                  Struppi.

                2. oops meine andere Antwort war an der falschne Stelle.

                  An dem Problem bin ich schon fast vorbei. Ich lese den Get-Wert aus und ersetze alle "+" durch ein &nbsp. Aber dazu später mehr...

                  use CGI; das macht das alles von alleine, es werden nicht nur Leerzeichen ersetzt sondern auch alle Sonderzeichen.

                  Ich habe das hier:

                  print "Hallo!";
                  print "\n";
                  print "Sie haben leider die Gästebuchregeln nicht bestätigt!";
                  print "\n";
                  print "Bitte klicken Sie auf die Zurückfunktion Ihres Browsers!";

                  im Perl stehen. Und wie befürchtet ergibt dies beim Client im Browserfenster diese komischen Zeichen, die man sieht, wenn man die Codierung nicht richtig hat. (betrifft alle Umlaute wie äüö und so was...)

                  Dann musst auch den Perl Code in utf8 schreiben.

                  Struppi.

                  1. Hi Struppi

                    oops meine andere Antwort war an der falschne Stelle.

                    Kein Problem.

                    Dann musst auch den Perl Code in utf8 schreiben.

                    Ist in utf-8 geschrieben. Nützt nichts. Ich mach dann mal feierabend für heute. Habe morgen Spätschicht, d. H. morgen früh kann ich eventuell noch mal kurz ein zwei Problemchen lösen vor der Arbeit - hab ja Zeit *g*

                    Im Perl steht bisher das hier:
                    ------------------------------------------------------
                    #!/usr/bin/perl -w

                    BEGIN {
                    use CGI::Carp qw(fatalsToBrowser warningsToBrowser);
                    warningsToBrowser(1);
                    }
                    use strict;
                    use CGI;

                    my $name;
                    my $text1;
                    my $text2;
                    my $text3;
                    my $regeln;
                    my $senden;
                    my $form_daten;

                    $form_daten = $ENV{'QUERY_STRING'};
                    my ($name, $text1, $text2, $text3, $regeln, $senden) = split(/&/,$form_daten);

                    if($regeln eq "regeln=on") {
                                        print CGI::header('text/plain');

                    print "Hallo!";
                                        print "\n";
                                        print "\n";
                                        print $name;
                                        print "\n";
                                        print $text1;
                                        print "\n";
                                        print $text2;
                                        print "\n";
                                        print $text3;
                                        print "\n";
                                        print $regeln;
                                        print "\n";
                                        print $senden;
                                        goto REGELENDE;
                                        }

                    print CGI::header('text/plain');
                    print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">',"\n";
                    print '<meta http-equiv="Content-Language" content="de">',"\n";
                    print '<meta http-equiv="Content-Type" content="text/html; charset=utf-8">',"\n";

                    print "Hallo!";
                    print "\n";
                    print "Sie haben leider die Gästebuchregeln nicht bestätigt!";
                    print "\n";
                    print "Bitte klicken Sie auf die Zurückfunktion Ihres Browsers!";

                    REGELENDE:
                    print "\n";
                    ---------------------------------------------------------------

                    Soweit ganz gut ;-)
                    Ich habe ja den leisen Verdacht, daß dieses Text-Plain am falschen Format schuld ist...

                    Gute Nacht zusammen -gäääähhhhhn

                    Gruß Gary

                    1. Hi,

                      my ($name, $text1, $text2, $text3, $regeln, $senden) = split(/&/,$form_daten);

                      Du verläßt Dich bei dieser Zeile darauf, daß die Parameter in einer bestimmten Reihenfolge übergeben werden.
                      HTML schreibt keine Reihenfolge vor für die Übergabe der form-Inhalte.

                      Darum (wie auch schon andere anmerkten):

                      use CGI!!!

                      cu,
                      Andreas

                      --
                      Warum nennt sich Andreas hier MudGuard?
                      O o ostern ...
                      Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
                      1. Hi,

                        my ($name, $text1, $text2, $text3, $regeln, $senden) = split(/&/,$form_daten);

                        Du verläßt Dich bei dieser Zeile darauf, daß die Parameter in einer bestimmten Reihenfolge übergeben werden.
                        HTML schreibt keine Reihenfolge vor für die Übergabe der form-Inhalte.

                        Aber das tuen sie doch. So wie die Reihenfolge im HTML, Wird doch die gesamte Kette übergeben. Oder ist das in anderen Browsern anders?

                        Gruß Gary

                        1. Hi,

                          Du verläßt Dich bei dieser Zeile darauf, daß die Parameter in einer bestimmten Reihenfolge übergeben werden.
                          HTML schreibt keine Reihenfolge vor für die Übergabe der form-Inhalte.

                          So wie die Reihenfolge im HTML,

                          Das ist mehr oder weniger Zufall. Die Reihenfolge ist nicht vorgeschrieben, Browser könnten die Werte auch in beliebiger anderer Reihenfolge schicken.

                          cu,
                          Andreas

                          --
                          Warum nennt sich Andreas hier MudGuard?
                          O o ostern ...
                          Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
                          1. Hi MudGuard,

                            Das ist mehr oder weniger Zufall. Die Reihenfolge ist nicht vorgeschrieben, Browser könnten die Werte auch in beliebiger anderer Reihenfolge schicken.

                            OK - wider was gelernt!

                            Das Übermittlungsproblem ist aber jetzt vom Tisch - weil ich hab ja jetzt CGI *grins*

                            Danke und Grüße Gary

                    2. use CGI;

                      Du musst das Modul natürlich auch nutzen.

                      my $name;
                      my $text1;
                      my $text2;
                      my $text3;
                      my $regeln;
                      my $senden;
                      my $form_daten;

                      $form_daten = $ENV{'QUERY_STRING'};
                      my ($name, $text1, $text2, $text3, $regeln, $senden) = split(/&/,$form_daten);

                      Heißt das, du übergibst die Daten willkürlich, nicht mit einem Formular?

                      üblich wäre ein Formular, das kannst du mit dem CGI Modul leicht zusammen bauen. Die Werte bekommst du dann auch mit diesem.

                      print CGI::header('text/plain');

                      Den Header darfst du nur einmal ausgeben und wenn du HTML willst, musst du natürlich auch den header entsprechend ausgeben. Steht alles in der Doku.

                      Ein einfaches HTML Dokument mit DOCTYPE und Kodierung sieht z.b. so aus:

                      #!/usr/bin/perl -w  
                      BEGIN {  
                      use CGI::Carp qw(fatalsToBrowser warningsToBrowser);  
                      warningsToBrowser(1);  
                      }  
                        
                      use strict;  
                      use CGI qw(-no_xhtml);  
                        
                      my $html_head = {  
                          -dtd    => '"-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"',  
                          -title  =>'Titel',  
                          -head =>  [  
                          CGI::meta({-http_equiv => 'Content-Type', -content => 'text/html; charset=utf-8'}),  
                          CGI::meta({-http_equiv => 'Content-Language', -content => 'de'})  
                          ]  
                      };  
                        
                      print CGI::header(-type=>'text/html', -charset=>'utf-8');  
                      print CGI::start_html($html_head);  
                        
                      # Dein Code  
                        
                      print CGI::end_html(); 
                      

                      Struppi.

                      1. use CGI;

                        Du musst das Modul natürlich auch nutzen.

                        Das mit dem start und end cgi ist zwar schön, ich weis aber nicht was das CGI alles sonst noch macht. Mir ist es lieber, wenn ich die HTML- Attribute selber setzen kann.

                        my $name;
                        my $text1;
                        my $text2;
                        my $text3;
                        my $regeln;
                        my $senden;
                        my $form_daten;

                        $form_daten = $ENV{'QUERY_STRING'};
                        my ($name, $text1, $text2, $text3, $regeln, $senden) = split(/&/,$form_daten);

                        Heißt das, du übergibst die Daten willkürlich, nicht mit einem Formular?

                        Doch, ich nehme die QS, zerlege sie und gib sie dann in die einzelnen Variabeln. Später will ich dann mit einem Suchstringbefehl die "+"-Zeichen heraussortieren und in einer guest.csv ablegen.

                        üblich wäre ein Formular, das kannst du mit dem CGI Modul leicht zusammen bauen. Die Werte bekommst du dann auch mit diesem.

                        Ein anderes als ich momentan verwende?

                        Das Formular gibt mir doch alles schön der Reihe nach. Einzige Ausnahme der Check-Knopf. Ist er nicht gesetzt, fehlt der Wert "regeln" ganz. Das habe ich aber mit einer IF- Abfrage bereits gelöst.

                        print CGI::header('text/plain');

                        War falsch (für meine Zwecke *g*) - ich habe es jetzt so gemacht:
                        ------------------------------------
                        use CGI -no_xhtml;
                        print CGI->header('text/html');
                        ------------------------------------

                        Und alles läuft.

                        Gruß Gary - Muss jetzt leider los...

                        1. use CGI;

                          Du musst das Modul natürlich auch nutzen.

                          Das mit dem start und end cgi ist zwar schön, ich weis aber nicht was das CGI alles sonst noch macht. Mir ist es lieber, wenn ich die HTML- Attribute selber setzen kann.

                          das Modul kann sehr viel und warum es dir lieber ist HTML code und Perl Code zu vermischen ist seltsam. Die Funktionen des Moduls helfen bei vielen Sachen, z.b. beim Aufbau von Tabellen, Formularen und Listen.

                          z.b. wird so aus einem Array von Werten, schnell eine HTML Liste erzeugt.

                          use CGI;  
                          my @list = qw(a b c d);  
                          print CGI::ul( CGI::li(\@list) );  
                          
                          

                          Bei Formularen ist es noch nützlicher, da du dir z.b. keine Gedanken mehr darum machen musst, dass die Werte wieder befüllt werden müssen, wenn jemand etwas fehlerhaft ausgefüllt hat.

                          Doch, ich nehme die QS, zerlege sie und gib sie dann in die einzelnen Variabeln. Später will ich dann mit einem Suchstringbefehl die "+"-Zeichen heraussortieren und in einer guest.csv ablegen.

                          Die Umwandlung aller notwendigen Zeichen macht CGI (hast du mal versucht wie es bei Umlauten bei dir aussieht?)

                          üblich wäre ein Formular, das kannst du mit dem CGI Modul leicht zusammen bauen. Die Werte bekommst du dann auch mit diesem.

                          Ein anderes als ich momentan verwende?

                          Ja.

                          HTML:
                          <input type="text" name="text1">

                          Perl:

                          my $text1 = CGI::param('text1');

                          Nichts weiter.

                          Das Formular gibt mir doch alles schön der Reihe nach.

                          zusammen mit dem Namen des feldes, das wertet alles das Mdoul CGI aus.

                          Struppi.

                          1. Hi Struppi

                            das Modul kann sehr viel und warum es dir lieber ist HTML code und Perl Code zu vermischen ist seltsam. Die Funktionen des Moduls helfen bei vielen Sachen, z.b. beim Aufbau von Tabellen, Formularen und Listen.

                            Bei Formularen ist es noch nützlicher, da du dir z.b. keine Gedanken mehr darum machen musst, dass die Werte wieder befüllt werden müssen, wenn jemand etwas fehlerhaft ausgefüllt hat.

                            Das wäre eine Gute Sache...

                            Die Umwandlung aller notwendigen Zeichen macht CGI (hast du mal versucht wie es bei Umlauten bei dir aussieht?)

                            OK, das war die Stelle die mich restlos Überzeugt hat. Ä,Ö,Ü sehen katastrophal aus.

                            Ein anderes als ich momentan verwende?

                            Ja.

                            HTML:
                            <input type="text" name="text1">

                            Perl:

                            my $text1 = CGI::param('text1');

                            Nichts weiter.

                            D. h. ich kann den Input-Teil im HTML-Code beibehalten, und habe dann im Perlscript mit -> my $text1 = CGI::param('text1'); zugriff auf das Feld "text1" und dessen Inhalt steckt dann in der Variable "$text1" ?

                            Das wäre sehr praktisch.

                            Ein paar Preisfragen:

                            -Wenn der Client in text1 nichts einträgt, was macht cgi?
                            -Wenn der eingegebene Text bei text1 Leerzeichen aufweist, sind die dann in $text1 mit  "+" oder tatsächlich mit Leerzeichen hinterlegt?

                            Bzw. ich brobier das gerade mal aus...

                            Gruß Gary

                            zusammen mit dem Namen des feldes, das wertet alles das Mdoul CGI aus.

                            Struppi.

                            1. Hi Struppi,

                              Echt geil! Das CGI ist so cool, das macht folgendes:

                              Gibt man nichts ein, ist die Variable auch leer. :-)
                              Gibt man Umlaute wie Ö,Ä,Ü ein, erscheinen diese in der Variable korrekt :-)
                              Gibt man Text mit Leerzeichen ein, wird er auch so in die Variable gegeben (ohne Pluszeichen!) :-)

                              Und es ist auch nur der Feldinhalt in der Variable. Stell dir vor, was das für ein Akt geworden wäre, wenn ich die lange Zeichenkette die QueryString liefert zu Fuß hätte zerlegen müssen. Und dann noch die ganzen Werte auf Plausibilität zu prüfen... *erleichtert*

                              Großes Danke an dich, da du so forciert auf die artgerechte Nutzung von CGI bestanden hast. Dies hat mir eine Menge Zeit und Code erspart.

                              Merci Gruß Gary

                              1. Hi zusammen,

                                Frage eins:
                                -----------

                                Nachdem ich eine Homepage in das Perlscript eingebunden habe, stimmt der Pfad nicht mehr.

                                Aus
                                www.wc-report.info/impressum.html

                                wird bei der Ausgabe dann

                                www.wc-report.info/cgi-bin/impressum.html

                                inklusive Fehlermeldung, da an dieser Stelle keine solche Datei existiert.

                                Wie kann ich das unterbinden?

                                Frage zwei:
                                -----------

                                Ich habe aus optischen Gründen auf den Unterseiten ein Pfeil stehen, der nach oben zeigt. Sieht so aus: /\

                                Im perl sieht er so aus:

                                print '<h2>/"",</h2>',"\n";

                                oder so

                                print qq('<h2>/</h2>),"\n";

                                oder was weis ich noch. Egal was ich mache, ich bekomme den "Backslash" einfach nicht in die HTML-Ausgabe.

                                Zu sehen hier wenn ihr alles im Formular leer last und das leere Formular einfach abschickt.

                                -> Kann ein Backslash überhaupt via Perl ausgegeben werden?

                                Gruß Gary

                                1. Nachdem ich eine Homepage in das Perlscript eingebunden habe, stimmt der Pfad nicht mehr.

                                  Aus
                                  www.wc-report.info/impressum.html

                                  wird bei der Ausgabe dann

                                  www.wc-report.info/cgi-bin/impressum.html

                                  inklusive Fehlermeldung, da an dieser Stelle keine solche Datei existiert.

                                  Wie kann ich das unterbinden?

                                  In dem du den Pfad genauer spezifizierst. Wenn du in dem Skript nur <a href="impressum.html"> schreibst, ist das relativ zum cgi-bin Verzeichnis. Entweder du nimmst das Wurzelverzeichniss: <a href="/impressum.html"> oder ermittelst die komplette URL

                                  Frage zwei:

                                  Ich habe aus optischen Gründen auf den Unterseiten ein Pfeil stehen, der nach oben zeigt. Sieht so aus: /\

                                  Im perl sieht er so aus:

                                  print '<h2>/"",</h2>',"\n";

                                  oder so

                                  print qq('<h2>/</h2>),"\n";

                                  oder so:

                                  print CGI::h2('/\\');

                                  oder was weis ich noch. Egal was ich mache, ich bekomme den "Backslash" einfach nicht in die HTML-Ausgabe.

                                  Du musst den Backslash maskieren.

                                  Struppi.

                                  1. Hi Struppi,

                                    Wie kann ich das unterbinden?

                                    In dem du den Pfad genauer spezifizierst. Wenn du in dem Skript nur <a href="impressum.html"> schreibst, ist das relativ zum cgi-bin Verzeichnis. Entweder du nimmst das Wurzelverzeichniss: <a href="/impressum.html"> oder ermittelst die komplette URL

                                    Genau so ging das. Wurzelverzeichnis - irgendwo im Hinterköpfchen war da was...  Slash ist gut!

                                    Ich habe aus optischen Gründen auf den Unterseiten ein Pfeil stehen, der nach oben zeigt. Sieht so aus: /\

                                    Im perl sieht er so aus:

                                    print '<h2>/"",</h2>',"\n";

                                    oder so

                                    print qq('<h2>/</h2>),"\n";

                                    oder so:

                                    print CGI::h2('/\\');

                                    oder so:

                                    print '<h2>/</h2>',"\n";

                                    Es war wie immer - die einfachste Variante!

                                    Du musst den Backslash maskieren.

                                    Das wusste ich - leider gibt es viele Arten von Masken - der reinste Maskenball hier *g*

                                    Gruß Gary

                                    1. Hi zusammen,

                                      Es gibt nach dem Selfhtml-Toturial eine Liste mit Perl-Umgebungsvariabeln. Dazu habe ich eine Frage:

                                      Zum Auslesen der IP stehen dort _zwei_ Möglichkeiten drin.

                                      A) HTTP_HOST
                                      und
                                      B) REMOTE_ADDR

                                      Es geht um das Gästebuchscript. Ich brauche die IP des Formularaufrufers.

                                      Also welches der beiden ist eurer Meinung nach besser geeignet?

                                      Die Datenbank (guest.csv), in der die Einträge gespeichert werden sollten, habe ich mir so vorgestellt:

                                      $name,$text1,$text2,$text3,$datum,$zeit,$ip

                                      Dann kann ich nämlich eine Abfage fahren:

                                      Wenn $ip = $ipaktuell -> goto SECUREBOOK

                                      SECUREBOOK:
                                      Wenn $datum = $datumaktuell and $zeit >= 1 Minute -> Eintrag in DB möglich.

                                      Wenn $datum > $datumaktuell -> Eintrag in DB möglich.

                                      Es geht nur darum, das dieselbe ip nicht 10000 Einträge via Programmschleife in die DB hineinschreibt.

                                      Gruß Gary

                                      1. Zum Auslesen der IP stehen dort _zwei_ Möglichkeiten drin.
                                        A) HTTP_HOST
                                        und
                                        B) REMOTE_ADDR
                                        Es geht um das Gästebuchscript. Ich brauche die IP des Formularaufrufers.
                                        Also welches der beiden ist eurer Meinung nach besser geeignet?

                                        Was ergibt:

                                        foreach(keys %ENV){  
                                          printf("%10s: %s\n", $_, $ENV{$_} );  
                                        }  
                                        
                                        

                                        Du wirst bemerken, dass REMOTE_HOST und HTTP_HOST ganz verschiedene Angaben sind.

                                        mfg Beat

                                        --
                                        ><o(((°>           ><o(((°>
                                           <°)))o><                     ><o(((°>o
                                        Der Valigator leibt diese Fische
                                        1. Hi Beat,

                                          Du wirst bemerken, dass REMOTE_HOST und HTTP_HOST ganz verschiedene Angaben sind.

                                          Habe

                                          $ENV{'REMOTE_ADDR'}

                                          genommen.

                                          Für Testzwecke lasse ich mir sämtliche Werte ausgeben. Du kannst es bereits online testen.

                                          Es muss der Name, das Kontrollhäkchen und mindestens ein Textfeld ausgefüllt werden. Alle anderen Kombinationen führen zu Fehlermeldungen.

                                          PS.: Keine Angst, es wird noch nichts gespeichert - auch wenn es bereits behauptet wird. Diese Funktion ist noch nicht implementiert (und das kann noch ein Weilchen dauern *g*).

                                          Gruß Gary

                                          1. Hallo zusammen,

                                            Variabeln Erklärung (Beispiel):

                                            $Jahr = Aktuelles Jahr vom Server (Jetzt)
                                            $DBJahr = Ausgelesenes Jahr aus der Datenbank (.csv-Dateilein)

                                            Also der Zusatz DB steht immer für den ausgelesenen Wert / Ohne Zusatz aktueller Wert.

                                            So, nun habe ich eine Abfrage die so aussieht:

                                            IF (
                                            $Ip = $DBIp and $Jahr = $DBJahr and $Monat = $DBMonat and $Tag = $DBTag and $Stunden = $DBStunden and $Minuten = ? <---Achtung!
                                            )

                                            {
                                            goto TimeError
                                            }

                                            Die Fragezeichenstelle ist interessant. Setzte ich dort $DBMinuten ein, ist die Folge, daß innerhalb des selben Tages in der gleichen Minute kein Post in das Gästebuch gemacht werden kann.

                                            Aber - Wie bekomme ich das hin, daß man sagen kann:
                                            Wenn der Client mit der selben Ip in eine kürzerem Abstand als 5Minuten versucht zu posten - in Bezug zu $Minuten - ist die IF bedingung erfüllt.

                                            Ich hoffe ihr versteht was ich meine - habe mühe das hier verständlich zu äußern...

                                            Gruß Gary

                                            1. Hallo zusammen

                                              IF (
                                              $Ip = $DBIp and $Jahr = $DBJahr and $Monat = $DBMonat and $Tag = $DBTag and $Stunden = $DBStunden and $Minuten = ? <---Achtung!
                                              )

                                              {
                                              goto TimeError
                                              }

                                              Ich glaube ich habe einen Lösungsansatz:

                                              Vor der Abfrage :

                                              Neue Variable für Differenzminuten

                                              $DifMin($Minuten-$DBMinuten)

                                              Dann sieht das alles so aus:

                                              IF (
                                              $Ip = $DBIp and $Jahr = $DBJahr and $Monat = $DBMonat and $Tag = $DBTag and $Stunden = $DBStunden and $DifMin <="5"
                                                 )

                                              {
                                              goto TimeError
                                              }

                                              Na wäre das eine Möglichkeit ? ***Kopf/Qualm/Rauch***

                                              Gruß Gary

                                              1. Morgen zusammen

                                                Da ich im Netz nichts finden konnte hier die Frage.

                                                Kann ma innerhalb einer If-Abfrage eine weitere if-Abfrage haben. Also so:

                                                IF (wenn bla + bla= blabla) {
                                                                            Code
                                                                            Code
                                                                            IF (wenn lol + lol = lollol) {
                                                                                                         Code
                                                                                                         Code
                                                                                                         Code
                                                                                                         }
                                                                            Code
                                                                            Code
                                                                            }

                                                Geht das?

                                                Grüße Gary

                                                1. Moin Moin!

                                                  Was spricht dagegen, die paar Zeilen in eine Datei zu schreiben und es dem Perl-Interpreter zum Fraß vorzuwerfen, mit strict und warnings?

                                                  Dann bekommst Du eine definitive Antwort.

                                                  Alexander

                                                  --
                                                  Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
                                                  1. Moin moin?

                                                    Klingt nach Hamburg *g*

                                                    Morgen auch! :-)

                                                    Bin dran das zu testen.
                                                    Leider bekomme ich einen fiktiven Variabel-Wert nicht in die Variable.
                                                    Deklariert habe ich sie so:

                                                    my $DBIp

                                                    Nun wollte ich DB-Zugriff simulieren, indem ich von Hand was übergebe. Probiert habe ich diese Varianten hier:

                                                    $DBIp = {'0815.4711.007'}
                                                    $DBIp = ('0815.4711.007')
                                                    $DBIp = 0815.4711.007

                                                    Leider ohne Erfolg! :-(

                                                    Wie bekomme ich diese fiktive IP in diese schxxx Variable hinein?

                                                    Gruß Gary

                                                    1. Hi,

                                                      So Problem erledigt. Hab ";" vergessen.
                                                      Muss los zu Arbeit...

                                                      Werde event. Heute Abend weitermachen --->ab 21:00 Uhr *stöhn*

                                                      Viele Grüße Gary

                                                      1. Abend zusammen,

                                                        Ich habe ein Programm das läuft von a nach z durch:

                                                        a
                                                        b
                                                        c
                                                        ...
                                                        x
                                                        y
                                                        z

                                                        Unterhalb von z liegt eine Sprungmarke:

                                                        a
                                                        b
                                                        c
                                                        ...
                                                        x
                                                        y
                                                        z

                                                        TimeError:
                                                        code
                                                        code
                                                        code
                                                        usw.

                                                        Trifft TimeError nicht zu, soll das Programm, wenn es bei z ankommt, stoppen. Z. B. so:

                                                        a
                                                        b
                                                        c
                                                        ...
                                                        x
                                                        y
                                                        z

                                                        exit(1)

                                                        TimeError:
                                                        code
                                                        code
                                                        code
                                                        usw.

                                                        Habe exit(1); und exit(0); und exit; ausprobiert. Das Programm läuft aber immer über den z-Teil drüber und gibt TimeError immer mit aus, obwohl der gar nicht angesprungen wurde. Ist Exit eventuell der falsche Befehl zum stoppen?

                                                        Gruß Gary

                                                        1. Habe exit(1); und exit(0); und exit; ausprobiert. Das Programm läuft aber immer über den z-Teil drüber ...

                                                          Das kann nicht sein. Du machst etwas falsch.
                                                          Struppi.

                                                          1. Morgen Struppi

                                                            Habe exit(1); und exit(0); und exit; ausprobiert. Das Programm läuft aber immer über den z-Teil drüber ...

                                                            Das kann nicht sein. Du machst etwas falsch.
                                                            Struppi.

                                                            Mir kommt da gerade eine Idee:

                                                            Kann es sein das exit nur der Ausstieg aus einer sub-Routine ist, und keine Stopperfunktion hat?

                                                            Ich suche sowas wie der Befehl "END" in Basic, wo man an beliebiger Stelle im Programm sagen kann ->Hier Programmende!

                                                            Gruß Gary

                                                            1. Hi Struppi

                                                              Habe das Problem jetzt wortwörtlich "Umgangen"...

                                                              a
                                                              b
                                                              c
                                                              ...
                                                              x
                                                              y
                                                              z
                                                              Ohne Abschlußzeile HTML

                                                              goto Ende;

                                                              TimeError:
                                                              code
                                                              code
                                                              code
                                                              Ohne Abschlußzeile HTML
                                                              usw.

                                                              Ende:
                                                              Abschlußzeile HTML

                                                              So läuft es. Die Sprungmarke wird übersprungen...

                                                              Zwar nicht so wie ich wollte - aber ein guter Kompromiss...

                                                              Gruß Gary

                                                              1. Habe das Problem jetzt wortwörtlich "Umgangen"...

                                                                Das ist ziemlicher Unsinn, denn man 1980 in Basic auf den C64 so programmiert hätte.

                                                                Zwar nicht so wie ich wollte - aber ein guter Kompromiss...

                                                                Du hast viele Möglichkeiten den Ablauf eines Programms zu steuern, goto ist die aller aller letzte Möglichkeit (die ich persönlich in Perl noch nie verwendet habe)

                                                                Struppi.

                                                    2. Nun wollte ich DB-Zugriff simulieren, indem ich von Hand was übergebe. Probiert habe ich diese Varianten hier:

                                                      Wieso probierst du?

                                                      Leider ohne Erfolg! :-(

                                                      Was heißt das? Wie lautet die Fehlermeldung?

                                                      Struppi.

                                                      1. Morgen Struppi

                                                        Wieso probierst du?

                                                        Weil die Syntax von Perl meist  oder oft mit diversen Platzhaltern, Klammern usw. erklärt werden - sich aber in der Praxis dann doch anders darstellt. Durch probieren (oder besser gesagt durch Abwandlungen) bekommt man es dann doch meistens irgendwie hin *gröööööl* ->Stichwort "Programmierstil"

                                                        Immer noch if-Thema:

                                                        Schwierigkeiten bereitet mir diese Abfrage:

                                                        if($ENV = $DBIp and $Jahr = $DBJahr and $Monat = $DBMonat and $Monatstag = $DBTag and $Stunden = $DBStunden and $DifMin <= 5) {
                                                                                                                                                                                goto TimeError;
                                                                                                                                                                                }

                                                        Als ich diese Abfrage schrieb, war das so gedacht, daß _alle_ Bedingungen zutreffen müssen, damit der in der Spitzklammer befindliche Code ausgeführt wird.

                                                        Also die gleiche Ip ($ENV=$DBIp) der aktuellen Sitzung, wie die, die aus der Datenbank ausgelesen wurde usw.....

                                                        Diese Anweisung da oben springt aber bereits zu TimeError, wenn nur die Differenzminuten ($DifMin) in dem gewälten Parameterbereich liegen.

                                                        Also auch wenn der Gästebucheintrag von Gestern gewesen wäre, reicht der IF-Anweisung, daß die Minuten vom DB-Eintrag zur aktuellen Zeit +-5 Minuten beträgt um den Sprung zu machen.

                                                        Das ist natürlich nicht gewollt. Es soll nur gesprungen werden, wenn der _gleiche_ Client am _gleichen_ Datum (Jahr,Tag,Zeit) zur _gleichen_ Zeit bis max 5 Minuten nach dem letzten Eintrag Posten möchte.

                                                        Ist "and" der richtige Operator, um mehrere Vergleiche, die _alle_ zutreffen müssen, zu machen?

                                                        Gruß Gary

                                                        1. Hi zusammen

                                                          Im Selfhtml steht:

                                                          Mit dem logischen Operator && oder dem Wort dafür (and) verknüpfen Sie zwei oder mehrere Bedingungen durch "und", d.h. beide bzw. alle Bedingungen müssen erfüllt sein, damit die gesamte Bedingung erfüllt ist.

                                                          Ergo-> Das...

                                                          if($ENV = $DBIp and $Jahr = $DBJahr and $Monat = $DBMonat and $Monatstag = $DBTag and $Stunden = $DBStunden and $DifMin <= 5) {
                                                                                                                                                                                  goto TimeError;
                                                                                                                                                                                  }

                                                          ...muss gehen! Warum geht es nicht?

                                                          PS.: Kann es daran liegen, das diese If-Abfrage in einer anderen If-Abfrage steckt? Fehlermeldung erhalte ich diesbezüglich keine.

                                                          Gruß Gary

                                                          1. if($ENV = $DBIp and $Jahr = $DBJahr and $Monat = $DBMonat and $Monatstag = $DBTag and $Stunden = $DBStunden and $DifMin <= 5) {

                                                            Wenn du die Empfehlungen, die gerade auch für Anfänger sinnvoll sind, in deine Skripte einbauen würdest, würdest du auch sehen was du falsch machst.

                                                            Das Skript läuft so nicht wenn du use strict und den Schalter -w (bzw. use warnings) benutzen würdest und die Meldungen würden dir anzeigen was du falsch machst.

                                                            goto TimeError;

                                                            und das ist der Horror, warum goto?

                                                            Struppi.

                                                            1. ... und die Meldungen würden dir anzeigen was du falsch machst.

                                                              Perl warnt nicht wenn man
                                                              if($var = $wert){}
                                                              statt
                                                              if($var eq $wert){}
                                                              oder
                                                              if($var == $wert){}
                                                              schreibt

                                                              Da hilft nur erzieherisches Kopf-an-die-Wand-schlagen-bis-es-blutet!

                                                              mfg Beat

                                                              --
                                                              ><o(((°>           ><o(((°>
                                                                 <°)))o><                     ><o(((°>o
                                                              Der Valigator leibt diese Fische
                                                              1. Hallo Ihr beiden :-)

                                                                ... und die Meldungen würden dir anzeigen was du falsch machst.

                                                                Perl warnt nicht wenn man
                                                                if($var = $wert){}
                                                                statt
                                                                if($var eq $wert){}
                                                                oder
                                                                if($var == $wert){}
                                                                schreibt

                                                                Ist den um Himmels-Willen "=" und "eq" nicht ein und dasselbe?

                                                                Da hilft nur erzieherisches Kopf-an-die-Wand-schlagen-bis-es-blutet!

                                                                *hehehehe...* Typisch Perl-Noob <totlach>

                                                                Also Jungs:
                                                                Wer viel verkraften kann, darf hier schauen - ist aber noch nicht fertig!

                                                                Die Knackpunktstelle ist dies:
                                                                ----------------------------------------
                                                                SameIp:
                                                                if($Jahr = $DBJahr) {
                                                                                 goto SameYear;
                                                                                 }
                                                                goto GoOn;

                                                                SameYear:
                                                                if($Monat = $DBMonat) {
                                                                                 goto SameMonth;
                                                                                 }
                                                                goto GoOn;

                                                                SameMonth:
                                                                if($Monatstag = $DBTag) {
                                                                                 goto SameDay;
                                                                                 }
                                                                goto GoOn;

                                                                SameDay:
                                                                if($Stunden = $DBStunden) {
                                                                                 goto TimeSpace;
                                                                                 }
                                                                goto GoOn;

                                                                TimeSpace:
                                                                if($DifMin <= 5) {
                                                                                 goto TimeError;
                                                                                 }
                                                                goto GoOn;

                                                                TimeError:
                                                                ----------------------------------------

                                                                Der Programmablauf dürfte nur bis zu TimeError durchdringen können, wenn alle oberen Abfragen einwandfrei sind.

                                                                Ist der Eintrag in die DB um 14:00 erfolgt, dürfte ein Post um 15:01 TimeError auslösen - tut es aber! (weil 01 Min im Bereich von den 05 Min liegt). Der merkt gar nicht, daß es eine andere Stunde ist.

                                                                Gruß Gary

                                                                1. Verbesserung:

                                                                  Es muss heisen _kein TimeError!

                                                                  Ist der Eintrag in die DB um 14:00 erfolgt, dürfte ein Post um 15:01  _kein_ TimeError auslösen - tut es aber! (weil 01 Min im Bereich von den 05 Min liegt). Der merkt gar nicht, daß es eine andere Stunde ist.

                                                                  Gruß Gary

                                                                2. goto ...

                                                                  Hell!
                                                                  Support-Verweigerung bis das letzte goto() verschwunden ist!

                                                                  mfg Beat

                                                                  --
                                                                  ><o(((°>           ><o(((°>
                                                                     <°)))o><                     ><o(((°>o
                                                                  Der Valigator leibt diese Fische
                                                                  1. Hi Beat,

                                                                    goto ...
                                                                    Hell!
                                                                    Support-Verweigerung bis das letzte goto() verschwunden ist!

                                                                    Toll! Und wie soll man dann einem Programm sagen, daß es woanders hinspringen soll?

                                                                    ->Das ist ja gerade so, als würde man einem Beinamputierten seine Krücken weg nehmen ... tztzt

                                                                    Gruß Gary

                                                                    PS: Nette HP - hab mal reingeschaut...

                                                                    1. goto ...
                                                                      Hell!
                                                                      Support-Verweigerung bis das letzte goto() verschwunden ist!

                                                                      Toll! Und wie soll man dann einem Programm sagen, daß es woanders hinspringen soll?

                                                                      Indem du bedingte Programmteile als sub function programmierst und bedingt aufrufst.

                                                                      mfg Beat

                                                                      --
                                                                      ><o(((°>           ><o(((°>
                                                                         <°)))o><                     ><o(((°>o
                                                                      Der Valigator leibt diese Fische
                                                                      1. Hi zusammen

                                                                        Indem du bedingte Programmteile als sub function programmierst und bedingt aufrufst.

                                                                        OK. Aber warum gibt es eine Sub Meldung ohne Subprogramme?
                                                                        Das wird doch mit Subprogramm auch nicht besser *g*

                                                                        Das Programm ist mittlerweile ohne Fehler. Beim nächsten Arbeitsabschnitt, worum es geht die 1. Zeile der Datei guest.csv auszulesen mekert der Server:

                                                                        ------------------------------------------------------------------------
                                                                        Bareword "LOCK_SH" not allowed while "strict subs" in use at GuestBookManager.pl line 328.
                                                                        ------------------------------------------------------------------------

                                                                        Wie gesagt kein sub in "use"!

                                                                        Und trotzdem kann ich die Datei nicht öffnen. Codeschnipsel:

                                                                        ------------------------------------------------------------------------
                                                                        ################################################

                                                                        Datenausleser für Kontrolle letzter Eintrag.

                                                                        ################################################

                                                                        open(LASTCONTROL, "<public/guest.csv");
                                                                        flock(LASTCONTROL, LOCK_SH);
                                                                        my $zeile = <LASTCONTROL>;
                                                                        my ($DBName, $DBText1, $DBText2, $DBText3, $DBIp, $DBTag, $DBMonat, $DBJahr, $DBStunden, $DBMinuten, $DBSekunden) = split(/;/,$zeile);
                                                                        close(LASTCONTROL);
                                                                        ------------------------------------------------------------------------

                                                                        Hinweise zur Fehlermeldung werden dankend angenommen! *ehrlich*

                                                                        PS.: Die Zeitsperre arbeitet übrigens mittlerweile einwandfrei.

                                                                        Grüse Gary

                                                                        1. Hi,

                                                                          Habe die Antwort hier im Forum gefunden (2004)

                                                                          THX

                                                                          Gary


                                                                        2. Bareword "LOCK_SH" not allowed while "strict subs" in use at GuestBookManager.pl line 328.


                                                                          ################################################

                                                                          Datenausleser für Kontrolle letzter Eintrag.

                                                                          ################################################

                                                                          open(LASTCONTROL, "<public/guest.csv");
                                                                          flock(LASTCONTROL, LOCK_SH);
                                                                          my $zeile = <LASTCONTROL>;
                                                                          my ($DBName, $DBText1, $DBText2, $DBText3, $DBIp, $DBTag, $DBMonat, $DBJahr, $DBStunden, $DBMinuten, $DBSekunden) = split(/;/,$zeile);
                                                                          close(LASTCONTROL);

                                                                          Hinweise zur Fehlermeldung werden dankend angenommen! *ehrlich*

                                                                          Dein Fehler liegt in Gedankenlosem Copy-Paste, ohne die Dokumentation zu lesen.
                                                                          LOCK_SH ist offenbar ein Symbol, das es zu importieren gilt.

                                                                          use Fcntl qw(:flock); #Importiert Symbole für das :flock Pragma

                                                                          mfg Beat

                                                                          --
                                                                          ><o(((°>           ><o(((°>
                                                                             <°)))o><                     ><o(((°>o
                                                                          Der Valigator leibt diese Fische
                                                                          1. Hi Beat :-)

                                                                            Dein Fehler liegt in Gedankenlosem Copy-Paste, ohne die Dokumentation zu lesen.
                                                                            LOCK_SH ist offenbar ein Symbol, das es zu importieren gilt.

                                                                            Nix Copy Paste / Von Hand!

                                                                            use Fcntl qw(:flock); #Importiert Symbole für das :flock Pragma

                                                                            Das habe ich wie du unten siehst bereits gelöst. Trozdem: Ich bin Besitzer eines Perl-Scrips, das einwandfrei läuft und (man höre und stauen) kein use Fcntl ':flock'; !

                                                                            Und das neue Perlscript (Das Gästebuch) läuft nur mit use Fcntl ':flock'; !

                                                                            Ein und der selbe Server !

                                                                            Da darf man sich doch als Laie die Frage erlauben, warum eines läuft und das andere nicht.

                                                                            PS.: Du hast das so use Fcntl qw(:flock); geschrieben.
                                                                                 Ich habe es so gemacht: Fcntl ':flock';

                                                                            Was ist besser und worin unterscheiden die sich?

                                                                            Gruß Gary

                                                                            1. Was ist besser und worin unterscheiden die sich?

                                                                              Beantworte es dir selber. Dazu gibt es Dokus.

                                                                              mfg Beat

                                                                              --
                                                                              ><o(((°>           ><o(((°>
                                                                                 <°)))o><                     ><o(((°>o
                                                                              Der Valigator leibt diese Fische
                                                                              1. Abend Beat

                                                                                Beantworte es dir selber. Dazu gibt es Dokus.

                                                                                Yep, in denen steht aber auch nicht immer alles...

                                                                                Bestes Beispiel:

                                                                                lock_SH
                                                                                lock_EX
                                                                                lock_UN
                                                                                lock_NB

                                                                                Zwar steht drin, was es macht, aber nicht, wie man es anwendet, bzw. was passiert, wenn mehrere Clients über Perl auf ein und dieselbe Datei zugreifen.

                                                                                Wie soll sowas ohne Stau oder Fehlermeldung (File allredy open) gehen?

                                                                                Solange man nur liest würde ich immer SH nehmen. Aber was ist wenn die Datei mehrmals zum lesen geöffnet wird (mehrere User schauen ins Gästebuch) und ein User möchte gleichzeitig ein Gästebucheintrag machen? Warten die Browser, oder bricht ein Browser dann ab?

                                                                                Vom Gefühl her müste dann der Client, der den Eintrag machen will bzw. das Perlscript die Datei im EX-Modus öffnen?

                                                                                Gruß Gary

                                                                                1. Solange man nur liest würde ich immer SH nehmen. Aber was ist wenn die Datei mehrmals zum lesen geöffnet wird (mehrere User schauen ins Gästebuch) und ein User möchte gleichzeitig ein Gästebucheintrag machen? Warten die Browser, oder bricht ein Browser dann ab?

                                                                                  Vom Gefühl her müste dann der Client, der den Eintrag machen will bzw. das Perlscript die Datei im EX-Modus öffnen?

                                                                                  wenn du
                                                                                  open($fh,'<',$file)
                                                                                  verwendest mit der Absicht zum späteren
                                                                                  open($fh,'>',$file)

                                                                                  brauchst du natürlich eine exklusive Lock.

                                                                                  Ich möchte dir auch
                                                                                  http://perldoc.perl.org/Tie/File.html#flock
                                                                                  nahelegen. Vor allem, da Tie::File oft praktischer/ratsam ist.

                                                                                  mfg Beat

                                                                                  --
                                                                                  ><o(((°>           ><o(((°>
                                                                                     <°)))o><                     ><o(((°>o
                                                                                  Der Valigator leibt diese Fische
                                                                                  1. Hi Beat

                                                                                    wenn du
                                                                                    open($fh,'<',$file)
                                                                                    verwendest mit der Absicht zum späteren
                                                                                    open($fh,'>',$file)

                                                                                    brauchst du natürlich eine exklusive Lock.

                                                                                    OK. Wenn ich aber die erste Öffnung wieder schliesse:

                                                                                    ------------------------------------------
                                                                                    open(LASTCONTROL, "<public/guest.csv");
                                                                                    flock(LASTCONTROL, LOCK_SH);
                                                                                    [...]
                                                                                    close(LASTCONTROL);
                                                                                    ------------------------------------------

                                                                                    und später mit einem neuen Handle öffne:

                                                                                    ------------------------------------------
                                                                                    open(BOOKENTRY, ">public/guest.csv");
                                                                                    flock(BOOKENTRY, LOCK_EX);
                                                                                    [...]
                                                                                    close(BOOKENTRY);
                                                                                    ------------------------------------------

                                                                                    dann kann die Kontrollöffnung "LASTCONTROL" für den letzten Gästebucheintrag zum IP_Vergleich doch getrost im SH-Modus statt finden - oder ? Nur beim Schreiben ist EX- Pflicht?

                                                                                    Eine letzte Frage für heute sei mir hoffentlich noch gestattet:
                                                                                    Es geht um das Öffnen der Datei für einen Gästebucheintrag. Wie stelle ich es an, daß wenn die Datei offen ist, die 11 Skalarwerte (Variablen) an den "Anfang" der Datei geschrieben werden. Also obendrauf. Das also immer der neueste Eintrag beim Öffnen der Datei zuerst gelesen wird.

                                                                                    Anhängen ging damals in Basic mit ich glaube "append" oder so ähnlich. Ich bräuchte aber das Gegenteil von ">>".

                                                                                    Das Script, welches später das Gästebuch ausliest soll ebenfalss zuerst vom obersten (neuesten) Eintrag zum älteren lesen. Ergo muss der neue Datensatz obendrauf!

                                                                                    Wenn das mit dem "Obendrauf" nicht geht, muss ich den Lesezeiger mit Seek? auf das Dateiende stellen.

                                                                                    Bei (LASTCONTROL) ist das kein Problem. Nur das Gästebuch auslesen wird dann schwierig, da der Gästebuchleser dann von den "Alten" Einträgen im Browser herunterscrollen muss, um die neusten Einträge zu sehen. Ich hätte aber die Neuen Einträge lieber oben.

                                                                                    Gruß und fast schon Gute Nacht Gary...

                                                                                    Habe morgen Frühschicht - *gähn*

                                                                                    Gruß Gary

                                                                                    1. dann kann die Kontrollöffnung "LASTCONTROL" für den letzten Gästebucheintrag zum IP_Vergleich doch getrost im SH-Modus statt finden - oder ? Nur beim Schreiben ist EX- Pflicht?

                                                                                      Nein, so wie ich gesagt habe.
                                                                                      Wenn du lesend öffnest mit der Absicht geänderte Daten zu schreiben, brauchst du exklusive Lock.

                                                                                      Eine letzte Frage für heute sei mir hoffentlich noch gestattet:
                                                                                      Es geht um das Öffnen der Datei für einen Gästebucheintrag. Wie stelle ich es an, daß wenn die Datei offen ist, die 11 Skalarwerte (Variablen) an den "Anfang" der Datei geschrieben werden. Also obendrauf. Das also immer der neueste Eintrag beim Öffnen der Datei zuerst gelesen wird.

                                                                                      Üffne lesend und speichere Zeilen in in Array
                                                                                      Üffne schreibend und schreibe neue Daten und array.

                                                                                      Das Script, welches später das Gästebuch ausliest soll ebenfalss zuerst vom obersten (neuesten) Eintrag zum älteren lesen. Ergo muss der neue Datensatz obendrauf!

                                                                                      Das gibt dir vielleicht einen kleinen Performance boost.
                                                                                      In Aller Regel willst du aber in einem GB ein Paging betreiben und die Einträge nach Datum sortiert anzeigen.

                                                                                      mfg Beat

                                                                                      --
                                                                                      ><o(((°>           ><o(((°>
                                                                                         <°)))o><                     ><o(((°>o
                                                                                      Der Valigator leibt diese Fische
                                                                                      1. Hi Beat

                                                                                        Nein, so wie ich gesagt habe.
                                                                                        Wenn du lesend öffnest mit der Absicht geänderte Daten zu schreiben, brauchst du exklusive Lock.

                                                                                        Danke - das wollte ich hören *grins*. Wird berücksichtigt und umgesetzt!

                                                                                        Üffne lesend und speichere Zeilen in in Array
                                                                                        Üffne schreibend und schreibe neue Daten und array.

                                                                                        Also wird sinngemäß der gesammte Inhalt der .CSV-Datei Zeilenweise eingelesen und in ein Feld bzw. du sagst Array gesteckt. Dann kann zuerst der neue Datensatz in die Datei geschrieben und das Array anschließend angehängt clever gemacht! Bei sehr vielen GB-Einträgen mache ich mir aber um das Array sorgen - größentechnisch *spekulier*

                                                                                        Das Script, welches später das Gästebuch ausliest soll ebenfalss zuerst vom obersten (neuesten) Eintrag zum älteren lesen. Ergo muss der neue Datensatz obendrauf!

                                                                                        Das gibt dir vielleicht einen kleinen Performance boost.
                                                                                        In Aller Regel willst du aber in einem GB ein Paging betreiben und die Einträge nach Datum sortiert anzeigen.

                                                                                        Ich bin da eher Anspruchslos. Ein einfaches anzeigen nach Nachrichteneingang reicht völlig. So nobel wie hier auf SelfHtml muß das nicht sein *grind*

                                                                                        Sorry Beat, bin echt müde muss pennen gehen...

                                                                                        Viele Grüße und ein dickes Merci for your help!

                                                                                        Gute Nacht Gary

                                                                                        1. Abend zusammen

                                                                                          Folgender Code bereitet mir Schwierigkeiten:
                                                                                          -------------------------------------------------------------------------
                                                                                          open(BOOKENTRY, "<public/guest.csv");
                                                                                          flock(BOOKENTRY, LOCK_EX);

                                                                                          while(! eof(BOOKENTRY)){
                                                                                          my $zeile = <BOOKENTRY>;
                                                                                          my ($DBName, $DBText1, $DBText2, $DBText3, $DBIp, $DBTag, $DBMonat, $DBJahr, $DBStunden, $DBMinuten, $DBSekunden) = split(/;/,$zeile);
                                                                                          push (@GuestData, $zeile);
                                                                                                                 }
                                                                                          close(BOOKENTRY);
                                                                                          -------------------------------------------------------------------------

                                                                                          Bis hierhin scheint alles zu funktionieren. Öffnen, auslesen, in $zeile packen, aufsplitten, komplette Zeile mit push in das Array @GuestData packen, File schliefßen - fertig.

                                                                                          -------------------------------------------------------------------------
                                                                                          open(BOOKENTRY, ">public/guest.csv");
                                                                                          flock(BOOKENTRY, LOCK_EX);
                                                                                          print BOOKENTRY $name,';',$text1,';',$text2,';',$text3,';',$ENV {'REMOTE_ADDR'},';',$Monatstag,';',$Monat,';',$Jahr,';',$Stunden,';',$Minuten,';',$Sekunden;

                                                                                          while(! eof(@GuestData)){

                                                                                          foreach $GuestOutput (@GuestData, $zeile) {
                                                                                          print BOOKENTRY $GuestOutput;
                                                                                                                                    }
                                                                                                                 }

                                                                                          close(BOOKENTRY);
                                                                                          -------------------------------------------------------------------------

                                                                                          Hier gibt es Probleme: AUfmachen zum Schreiben - ok. Cgi-Skalare (Clientangaben) in geöffnete Datei schreiben - ok.
                                                                                          while mit eof (end of File) geht wahrscheinlich nicht, da kein File sondern Array. While eof (@GuestData) geht auch nicht.

                                                                                          Wie kann ich ein eingelesenes Array (@GuestData) zeilenweise auslesen und schreiben - wenns geht mit print- bis es leer ist?

                                                                                          Gruß Gary

                                                                                          1. Hallo zusammen,

                                                                                            Alles OK. Habe es hinbekommen. Programm läuft! Ein paar Kleinigkeiten, Sicherungen usw. muss ich noch einbauen aber sonst funktioniert es so wie Beat empfohlen hat.

                                                                                            Einlesen, neue Daten schreiben, anschließend alte Daten aus Array dranhängen - fertig.

                                                                                            Morgen nach der Arbeit geht es dann weiter mit dem Gästebuchscript, welches die Einträge dann listet. Das ist aber reine Formsache und sollte schnell von der Hand gehen.

                                                                                            Danke an alle !

                                                                                            Gruß Gary

                                                                                          2. Folgender Code bereitet mir Schwierigkeiten:

                                                                                            Ja, einige.

                                                                                            Du wirst ein paar Tage dich daran versuchen, um dann festzustellen, dass es sinnvoller ist Module zu verwenden, weil so viele Fallstricke lauern und du noch soviele andere Sachen lernen musst, dass es Irrsinn wäre sich jede Grundlage selbst zu programmieren.

                                                                                            Eine der wichtigsten und besten Eigenschaften von Perl ist die Modulvielfalt auf CPAN, wer das nicht nutzt, lernt Perl nie.


                                                                                            open(BOOKENTRY, "<public/guest.csv");

                                                                                            Hier fehlt eine Fehlerabfrage, sobald etwas schief läuftt, wirst du wieder Probleme haben, weil du nicht weißt wo, wenn du nicht prüfst ob eine Operation geklappt hat.

                                                                                            flock(BOOKENTRY, LOCK_EX);

                                                                                            dito.

                                                                                            while(! eof(BOOKENTRY)){

                                                                                            üblicherweise sieht eine solche Schleife so aus:

                                                                                            while(<BOOKENTRY>){  
                                                                                            chomp; # Newline entfernen  
                                                                                            my $zeile = $_; # Ist aber unnötig, da du gleich $_ splitten kannst.  
                                                                                            
                                                                                            

                                                                                            Bis hierhin scheint alles zu funktionieren. Öffnen, auslesen, in $zeile packen, aufsplitten, komplette Zeile mit push in das Array @GuestData packen, File schliefßen - fertig.

                                                                                            Wenn du das in einem Skript machst, hast du schon das erste große Problem. Sobald du die Datei geschlossen hast, ist der flock entfernt und ein anderer Prozess kann auf die Datei zugreifen und diese verändern.

                                                                                            Wenn du eine Datei lesen und schreiben willst, musst du die Datei immer während des ganzen Prozesses geöffnet halten.

                                                                                            print BOOKENTRY $name,';',$text1,';',$text2,';',$text3,';',$ENV {'REMOTE_ADDR'},';',$Monatstag,';',$Monat,';',$Jahr,';',$Stunden,';',$Minuten,';',$Sekunden;

                                                                                            Etwas schöner ist hier ein join

                                                                                            print BOOKENTRY join ';', [$name, $text1, $text2, ,$text3, $ENV{REMOTE_ADDR}, $Monatstag, $Monat, $Jahr, $Stunden, $Minuten, $Sekunden];  
                                                                                            
                                                                                            

                                                                                            while(! eof(@GuestData)){

                                                                                            Das ist hier natürlich völliger Unsinn, du willst ja schreiben, also u.U. über das Ende der Datei hinaus schreiben, dieser Aspekt interessiert dich hier nicht.

                                                                                            Wie kann ich ein eingelesenes Array (@GuestData) zeilenweise auslesen und schreiben - wenns geht mit print- bis es leer ist?

                                                                                            Ich glaube Beat hat dir bereits ein Modul genannt, dass das alles macht. Du sparst dir damit viel Arbeit und lernst auch mehr Perl, als so wie du es jetzt machst.

                                                                                            Struppi.

                                                                                          3. Abend zusammen

                                                                                            Folgender Code bereitet mir Schwierigkeiten:

                                                                                            open(BOOKENTRY, "<public/guest.csv");
                                                                                            flock(BOOKENTRY, LOCK_EX);

                                                                                            while(! eof(BOOKENTRY)){

                                                                                            Wieso nicht:
                                                                                            while(<BOOKENTRY>){...}

                                                                                            my $zeile = <BOOKENTRY>;
                                                                                            my ($DBName, $DBText1, $DBText2, $DBText3, $DBIp, $DBTag, $DBMonat, $DBJahr, $DBStunden, $DBMinuten, $DBSekunden) = split(/;/,$zeile);
                                                                                            push (@GuestData, $zeile);

                                                                                            Du bist dir im Klaren, dass eine einzige HTML Entität in einem der Felder deine Ordnung zerstört?

                                                                                            Jedes _Datenbank-Format_ hat einen Format-Kontext. Alle Daten, die diesen Kontext berühren, müssen maskiert werden auf eine Weise, die zweifelsfreie Unmask möglich machen.

                                                                                            mfg Beat

                                                                                            --
                                                                                            ><o(((°>           ><o(((°>
                                                                                               <°)))o><                     ><o(((°>o
                                                                                            Der Valigator leibt diese Fische
                                                                                            1. Abend zusammen

                                                                                              Du bist dir im Klaren, dass eine einzige HTML Entität in einem der Felder deine Ordnung zerstört?

                                                                                              Genau daran arbeite ich im Moment:

                                                                                              -------------------------------------------
                                                                                              my $name = CGI::param('name');

                                                                                              $name =~ s/;//gi;
                                                                                              $name =~ s/<//gi;
                                                                                              $name =~ s/>//gi;
                                                                                              $name =~ s/*//gi;
                                                                                              $name =~ s/|//gi;
                                                                                              $name =~ s/[//gi;
                                                                                              $name =~ s/]//gi;
                                                                                              $name =~ s/{//gi;
                                                                                              $name =~ s/}//gi;
                                                                                              $name =~ s/@//gi;
                                                                                              -------------------------------------------

                                                                                              Nur als Beispiel der ersten übergebenen CGI-Information. Dieser von mir entwickelte Code (hehe) sollte $name nach zwischen den  Slashes stehenden Zeichen (erstes ist ein Semikolon) durchsuchen und gegen ein Leerzeichen ersetzen. -> Soweit die Theorie.

                                                                                              Inder Praxis sieht das dann so aus:

                                                                                              Quantifier follows nothing in regex; marked by <-- HERE in m/* <-- HERE / at GuestBookManager.pl line 26.  ->Fehlermeldung

                                                                                              Ich habe mich streng an das SelfHtml-Beispiel gehalten:

                                                                                              http://de.selfhtml.org/perl/sprache/regexpr.htm#beispiel7

                                                                                              Warum die Fehlermeldung?

                                                                                              Jedes _Datenbank-Format_ hat einen Format-Kontext. Alle Daten, die diesen Kontext berühren, müssen maskiert werden auf eine Weise, die zweifelsfreie Unmask möglich machen.

                                                                                              Wenn ich dich richtig verstehe (und das ist nicht immer einfach), ist mein Datenbank-Kontext ein Semikolon.  Das und einige andere HTML und Steuerzeichen für Schadcode muss ich allso schon vorher entfernen. Das sollte der obere Code eigentlich machen... eigentlich.

                                                                                              Prost Gary

                                                                                              PS. Juhuuu Morgen darf ich bereits um 16:00 Uhr in Feierabend - Ich mag meinen Job, aber früher frei zu haben ist auch ok *g*

                                                                                              1. Hi,

                                                                                                $name =~ s/;//gi;
                                                                                                $name =~ s/<//gi;
                                                                                                $name =~ s/>//gi;
                                                                                                $name =~ s/*//gi;
                                                                                                $name =~ s/|//gi;
                                                                                                $name =~ s/[//gi;
                                                                                                $name =~ s/]//gi;
                                                                                                $name =~ s/{//gi;
                                                                                                $name =~ s/}//gi;
                                                                                                $name =~ s/@//gi;

                                                                                                Nur als Beispiel der ersten übergebenen CGI-Information. Dieser von mir entwickelte Code (hehe) sollte $name nach zwischen den  Slashes stehenden Zeichen (erstes ist ein Semikolon) durchsuchen und gegen ein Leerzeichen ersetzen. -> Soweit die Theorie.

                                                                                                Deine Theorie ist falsch. Es wird nicht durch ein Leerzeichen ersetzt, sondern durch nichts.

                                                                                                Quantifier follows nothing in regex; marked by <-- HERE in m/* <-- HERE / at GuestBookManager.pl line 26.  ->Fehlermeldung

                                                                                                Natürlich. * ist ein Quantifier, der im Regex sagt, daß das vorherige Regex-Element 0 bis unendlich oft vorkommen soll - es gibt aber kein vorheriges Element im Regex ==> Fehlermeldung.
                                                                                                Wenn Du Regex-spezifische Zeichen als normale Zeichen verwenden willst, mußt Du sie escapen mit einem \ oder aber das Zeichen in eine Zeichenklasse packen: [*]

                                                                                                Die Verwendung einer Zeichenklasse würde sich sowieso anbieten:
                                                                                                $name = s/[;<>*|[{}@]]//g;
                                                                                                Innerhalb der Zeichenklasse haben nur noch ganz wenige Zeichen Sonderbedeutung (das ^ falls es an erster Stelle steht, das - wenn es nicht an erster Stelle (bzw. an zweiter, falls an erster Stelle ein ^ steht) oder letzter Stelle steht, ])

                                                                                                Das i ist nicht notwendig, da ja keine Buchstaben in Deinem Regex vorhanden sind, es also egal ist, ob Groß- oder Kleinschreibung vorliegt.

                                                                                                http://de.selfhtml.org/perl/sprache/regexpr.htm#beispiel7

                                                                                                Warum die Fehlermeldung?

                                                                                                Weil ein einziges Beispiel nicht den kompletten Leistungsumfang von Regulären Ausdrücken zeigen kann.

                                                                                                Wenn ich dich richtig verstehe (und das ist nicht immer einfach), ist mein Datenbank-Kontext ein Semikolon.

                                                                                                Nein. Es sind im Datenbank-Kontext all die Zeichen zu berücksichtigen, die für die Datenbank eine Sonderbedeutung haben.
                                                                                                Zumindest der \ ist meist auch noch zu beachten.
                                                                                                Üblicherweise bietet das Datenbank-Interface aber Methoden, die sich um das passende Escaping kümmern.

                                                                                                Das und einige andere HTML und Steuerzeichen für Schadcode muss ich allso schon vorher entfernen.

                                                                                                Für die Datenbank ist HTML-Code (wenn Datenbank-Kontext-gerecht escaped) überhaupt kein Problem.

                                                                                                HTML-Code muß dann gesondert behandelt werden, wenn eine Ausgabe in ein HTML-Dokument erfolgt.

                                                                                                Allgemeiner:
                                                                                                Strings müssen immer dann kontext-gerecht behandelt werden, wenn sie in einen anderen Kontext gebracht werden.

                                                                                                cu,
                                                                                                Andreas

                                                                                                --
                                                                                                Warum nennt sich Andreas hier MudGuard?
                                                                                                O o ostern ...
                                                                                                Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
                                                                                                1. Hi MudGuard

                                                                                                  Die Verwendung einer Zeichenklasse würde sich sowieso anbieten:
                                                                                                  $name = s/[;<>*|[{}@]]//g;
                                                                                                  Innerhalb der Zeichenklasse haben nur noch ganz wenige Zeichen Sonderbedeutung (das ^ falls es an erster Stelle steht, das - wenn es nicht an erster Stelle (bzw. an zweiter, falls an erster Stelle ein ^ steht) oder letzter Stelle steht, ])

                                                                                                  Das mit dem Escapen habe ich  dann später herausgefunden.

                                                                                                  Das i ist nicht notwendig, da ja keine Buchstaben in Deinem Regex vorhanden sind, es also egal ist, ob Groß- oder Kleinschreibung vorliegt.

                                                                                                  Danke,auf das ist mir später in den Sinn gekommen.

                                                                                                  Für die Datenbank ist HTML-Code (wenn Datenbank-Kontext-gerecht escaped) überhaupt kein Problem.

                                                                                                  Du meinst also es genügt, wenn ich lediglich das Semikolon aussperre, da es in der DB als Abtrenner dient?

                                                                                                  HTML-Code muß dann gesondert behandelt werden, wenn eine Ausgabe in ein HTML-Dokument erfolgt.

                                                                                                  Allgemeiner:
                                                                                                  Strings müssen immer dann kontext-gerecht behandelt werden, wenn sie in einen anderen Kontext gebracht werden.

                                                                                                  OK, jetzt verstehe ich langsam die worte deiner Vorredner *g*

                                                                                                  Ganz schnell noch Code weil muß zur Arbeit:

                                                                                                  ------------------------------------------
                                                                                                  my $sizename = length($name);
                                                                                                  if($sizename > 20){
                                                                                                                goto SizeError;
                                                                                                                }

                                                                                                  my $sizetext1 = length($text1);
                                                                                                  if($sizetext1 > 50){
                                                                                                                     goto SizeError;
                                                                                                                     }

                                                                                                  my $sizetext2 = length($text2);
                                                                                                  if($sizetext2 > 50){
                                                                                                                     goto SizeError;
                                                                                                                     }

                                                                                                  my $sizetext3 = length($text3);
                                                                                                  if($sizetext3 > 50){
                                                                                                                     goto SizeError;
                                                                                                                     }
                                                                                                  ------------------------------------------

                                                                                                  So checke ich auf ein selbergebautes Eingabeformular die Länge der CGI-Info.

                                                                                                  Und so die unerwünschten Zeichen:
                                                                                                  --------------------------------
                                                                                                  $name =~ s/;//g;
                                                                                                  $name =~ s/<//g;
                                                                                                  $name =~ s/>//g;
                                                                                                  $name =~ s/\*//g;
                                                                                                  $name =~ s/|//g;
                                                                                                  $name =~ s/[//g;
                                                                                                  $name =~ s/]//g;
                                                                                                  $name =~ s/{//g;
                                                                                                  $name =~ s/}//g;
                                                                                                  $name =~ s/@//g;
                                                                                                  $name =~ s/&//g;
                                                                                                  $name =~ s/\//g;

                                                                                                  $text1 =~ s/;//g;
                                                                                                  $text1 =~ s/<//g;
                                                                                                  $text1 =~ s/>//g;
                                                                                                  $text1 =~ s/\*//g;
                                                                                                  $text1 =~ s/|//g;
                                                                                                  $text1 =~ s/[//g;
                                                                                                  $text1 =~ s/]//g;
                                                                                                  $text1 =~ s/{//g;
                                                                                                  $text1 =~ s/}//g;
                                                                                                  $text1 =~ s/@//g;
                                                                                                  $text1 =~ s/&//g;
                                                                                                  $text1 =~ s/\//g;

                                                                                                  $text2 =~ s/;//g;
                                                                                                  $text2 =~ s/<//g;
                                                                                                  $text2 =~ s/>//g;
                                                                                                  $text2 =~ s/\*//g;
                                                                                                  $text2 =~ s/|//g;
                                                                                                  $text2 =~ s/[//g;
                                                                                                  $text2 =~ s/]//g;
                                                                                                  $text2 =~ s/{//g;
                                                                                                  $text2 =~ s/}//g;
                                                                                                  $text2 =~ s/@//g;
                                                                                                  $text2 =~ s/&//g;
                                                                                                  $text2 =~ s/\//g;

                                                                                                  $text3 =~ s/;//g;
                                                                                                  $text3 =~ s/<//g;
                                                                                                  $text3 =~ s/>//g;
                                                                                                  $text3 =~ s/\*//g;
                                                                                                  $text3 =~ s/|//g;
                                                                                                  $text3 =~ s/[//g;
                                                                                                  $text3 =~ s/]//g;
                                                                                                  $text3 =~ s/{//g;
                                                                                                  $text3 =~ s/}//g;
                                                                                                  $text3 =~ s/@//g;
                                                                                                  $text3 =~ s/&//g;
                                                                                                  $text3 =~ s/\//g;
                                                                                                  --------------------------------

                                                                                                  Scheint alles zu funktionieren.

                                                                                                  Gruß Gary

                                                                                                  PS.: Muss jetzt aber los

                                                                                                  Bye

                                                                                                  1. Hi,

                                                                                                    Die Verwendung einer Zeichenklasse würde sich sowieso anbieten:
                                                                                                    $name = s/[;<>*|[{}@]]//g;
                                                                                                    Das mit dem Escapen habe ich  dann später herausgefunden.

                                                                                                    Aber, wie weiter unten zu sehen ist, hast Du das mit der Zeichenklasse noch nicht verstanden.

                                                                                                    Für die Datenbank ist HTML-Code (wenn Datenbank-Kontext-gerecht escaped) überhaupt kein Problem.
                                                                                                    Du meinst also es genügt, wenn ich lediglich das Semikolon aussperre, da es in der DB als Abtrenner dient?

                                                                                                    Nein, das meine ich nicht. Es muß Datenbank-Kontext-gerecht escaped werden. Und das betrifft NICHT nur das ;

                                                                                                    OK, jetzt verstehe ich langsam die worte deiner Vorredner *g*

                                                                                                    Offensichtlich nicht. Sonst würdest Du für die Datenbank nicht nur das ; behandeln wollen.

                                                                                                    $name =~ s/;//g;
                                                                                                    $name =~ s/<//g;
                                                                                                    $name =~ s/>//g;
                                                                                                    $name =~ s/\*//g;
                                                                                                    $name =~ s/|//g;
                                                                                                    $name =~ s/[//g;
                                                                                                    $name =~ s/]//g;
                                                                                                    $name =~ s/{//g;
                                                                                                    $name =~ s/}//g;
                                                                                                    $name =~ s/@//g;
                                                                                                    $name =~ s/&//g;
                                                                                                    $name =~ s/\//g;

                                                                                                    Ich hab doch extra ein Beispiel mit Zeichenklasse in mein Posting gesetzt.

                                                                                                    Scheint alles zu funktionieren.

                                                                                                    Ja, aber der Schein trügt.

                                                                                                    cu,
                                                                                                    Andreas

                                                                                                    --
                                                                                                    Warum nennt sich Andreas hier MudGuard?
                                                                                                    O o ostern ...
                                                                                                    Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
                                                                                                    1. Hi Mud Guard

                                                                                                      Aber, wie weiter unten zu sehen ist, hast Du das mit der Zeichenklasse noch nicht verstanden.

                                                                                                      Ich schau mir das mit der Zeichenklasse noch mal an - weil immer noch nicht ganz verstanden was das genau ist.

                                                                                                      Nein, das meine ich nicht. Es muß Datenbank-Kontext-gerecht escaped werden. Und das betrifft NICHT nur das ;

                                                                                                      Das Semikolon _muss_ ich herausfiltern, da sonst in der .csv-Datei ein wahnsinniges Durcheinander entsteht!

                                                                                                      Die Anderen Zeichen sind mir noch nicht ganz klar. Zwar erhöht jedes Zeichen, daß ich lösche die Sicherheit, gleichzeitig beraubt es aber den User/Client um ein Zeichen, welches er dann weniger zur verfügung hat.

                                                                                                      Offensichtlich nicht. Sonst würdest Du für die Datenbank nicht nur das ; behandeln wollen.

                                                                                                      $name =~ s/;//g;
                                                                                                      $name =~ s/<//g;
                                                                                                      $name =~ s/>//g;
                                                                                                      $name =~ s/\*//g;
                                                                                                      $name =~ s/|//g;
                                                                                                      $name =~ s/[//g;
                                                                                                      $name =~ s/]//g;
                                                                                                      $name =~ s/{//g;
                                                                                                      $name =~ s/}//g;
                                                                                                      $name =~ s/@//g;
                                                                                                      $name =~ s/&//g;
                                                                                                      $name =~ s/\//g;

                                                                                                      Ich hab doch extra ein Beispiel mit Zeichenklasse in mein Posting gesetzt.

                                                                                                      Scheint alles zu funktionieren.

                                                                                                      Ja, aber der Schein trügt.

                                                                                                      Man ist das kompliziert! Escapen, nicht escapen, maskieren verstecken und, und, und, ...

                                                                                                      Das große _Warum_ habe ich immer noch nicht verstanden. HTML-Code in einer CSV-Datei kann mir doch gar nichts machen. Außer das Semikolon, weil ich diesen als Abtrenner benutze.

                                                                                                      beim Auslesen aus der .csv, steht doch der ausgelesene Teil in <p>'s und in "Anführungszeichen". Das wird 1:1 als Text ausgegeben. Also sollte da auch nichts passieren. Warum der ganze Wirbel um: Der Client darf keinen gültigen HTML-Code generieren? Kriminell wird es wenn er ausführbaren Perlkode generiert. Dann ist der Server weg :-(

                                                                                                      Bin heute auf jeden Fall ein großes Stück weiter gekommen. So gut wie fertig.

                                                                                                      Einfach mal kurz ins Gästebuch schauen - es beisst nicht! :-)
                                                                                                      Link ist unten links...

                                                                                                      Gruß und gute Nacht

                                                                                                      Gary

                                                              2. ... und die Meldungen würden dir anzeigen was du falsch machst.

                                                                Perl warnt nicht wenn man
                                                                if($var = $wert){}
                                                                statt
                                                                if($var eq $wert){}
                                                                oder
                                                                if($var == $wert){}
                                                                schreibt

                                                                Dann macht dein Perl es anders als meins:

                                                                #!/usr/bin/perl -w  
                                                                use strict;  
                                                                  
                                                                my $v = 'x';  
                                                                  
                                                                print 'ja' if $v = 1;  
                                                                
                                                                

                                                                Ausgabe:
                                                                Found = in conditional, should be == at t.pl line 5.
                                                                ja

                                                                Struppi.

                                            2. Zwei Dinge sollten für dein Anliegen reichen

                                              sha1_hex($ENV{REMOTE_HOST})

                                              und ein UNIX Timestamp, also das Resultat von time();

                                              mfg Beat

                                              --
                                              ><o(((°>           ><o(((°>
                                                 <°)))o><                     ><o(((°>o
                                              Der Valigator leibt diese Fische
                                      2. Moin Moin!

                                        Zum Auslesen der IP stehen dort _zwei_ Möglichkeiten drin.

                                        Ich denke, das hast Du entweder falsch gelesen oder es ist tatsächlich falsch geschrieben. URL des Artikels?

                                        A) HTTP_HOST
                                        und
                                        B) REMOTE_ADDR

                                        Es geht um das Gästebuchscript. Ich brauche die IP des Formularaufrufers.

                                        HTTP_HOST ist der Name, unter dem der CLIENT den Server anspricht. Wie alle anderen HTTP_xxx-Header auch sind das Informationen vom Client, der bekanntlich ein notorischer Lügner mit böswilligen Absichten ist, bis das Gegenteil bewiesen ist.

                                        REMOTE_ADDR kommt vom Webserver, der ermittelt das über die Socket-API des Betriebssystems.

                                        Das ist aber nicht notwendigerweise die IP-Adresse des Clients, sondern die Adresse der Maschine, die die Verbindung zum Webserver hergestellt hat. Dieses Posting wird der SelfHTML-Server mit einer REMOTE_ADDR von xxx.91.52.254 sehen, aber abgeschickt wurde es von einem Rechner mit der IP-Adresse 10.xxx.xxx.35. Triviale Erklärung: Ich muß hier über einen Proxy ins Internet gehen, wie auch meine Kollegen. Und dessen Internet-seitige IP-Adresse ist die xxx.91.52.254.

                                        Die REMOTE_ADDR identifiziert also höchstens meinen Arbeitgeber, aber keinen einzelnen Rechner, geschweige denn einzelne Menschen. HTTP_HOST ist fast beliebig und dient nur dazu, auf dem Server zwischen verschiedenen VHosts zu unterscheiden. Auf einem Server ohne VHosts ist HTTP_HOST völlig irrelevant.

                                        Alexander

                                        --
                                        Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
                                        1. Hi Alexander,

                                          Ich denke, das hast Du entweder falsch gelesen oder es ist tatsächlich falsch geschrieben. URL des Artikels?

                                          http://de.selfhtml.org/servercgi/cgi/umgebungsvariablen.htm#uebersicht Hast recht, ersteres liefert die URL in der Adressleiste des Aufrufenden Browsers - also für mich irrelevant.

                                          A) HTTP_HOST
                                          und
                                          B) REMOTE_ADDR

                                          REMOTE_ADDR kommt vom Webserver, der ermittelt das über die Socket-API des Betriebssystems.

                                          Das ist aber nicht notwendigerweise die IP-Adresse des Clients, sondern die Adresse der Maschine, die die Verbindung zum Webserver hergestellt hat.

                                          Aber quasi die letzte "Zwischenstation" eines "Servers" oder "Computers", der die Anfrage an meinen Server weitergeleitet hat (oder mit glück auch die direkte IP). Und da laut Telekom-Gesetz (mir ist bewußt das die Telekom nicht befugt ist Gesetze zu erlassen) also ich meine Telekomunikationsgedöhns müssen alle Verbindungsdaten eine "gewisse" Zeit gespeichert werden. Das heist, daß wenn einer mutwillig den Server außer Gefecht setzt oder sonst wie beschädigt, kann z. B. die Polizei, anhand der IP, Datum, Uhrzeit die jeweiligen Proxies-, Zwischenserverbetreiber auffordern die weiteren Daten frei zu geben. Und irgend wann müsste man doch auch den definitiven Anschluß bei Mr. Evil haben?

                                          Lange Rede kurzer Sinn: Die Endadresse ist doch sicherlich besser als gar nichts. Da hat man doch wenigstens das Ende der Schnurr in der Hand!

                                          Oder ist es anders?

                                          Gruß Gary

                                          1. Und da laut Telekom-Gesetz (mir ist bewußt das die Telekom nicht befugt ist Gesetze zu erlassen) also ich meine Telekomunikationsgedöhns müssen alle Verbindungsdaten eine "gewisse" Zeit gespeichert werden.

                                            Unsinn!
                                            Das betrifft doch nicht dich als Privatperson. Ganz im gegenteil, du darfst die IP eigentlich gar nicht speichern (zumindest ist dieser Vorgang umstritten) und wenn musst du darauf hinweisen, das du es tust.

                                            Struppi.

                                            1. Und da laut Telekom-Gesetz (mir ist bewußt das die Telekom nicht befugt ist Gesetze zu erlassen) also ich meine Telekomunikationsgedöhns müssen alle Verbindungsdaten eine "gewisse" Zeit gespeichert werden.

                                              Unsinn!
                                              Das betrifft doch nicht dich als Privatperson. Ganz im gegenteil, du darfst die IP eigentlich gar nicht speichern (zumindest ist dieser Vorgang umstritten) und wenn musst du darauf hinweisen, das du es tust.

                                              Ich weis, das ich sie nicht speichern muss. Aber ich hätte sie gerne zur Hand, Falls einer mutwilligen Mist baut bei einem Gästebucheintrag.

                                              Der Ip-Speicherhinweis wird in den Gästebuchregeln erwähnt werden. Außerdem sehen Poster bei mir als Rückmeldung vom Server die Eintragungen im Detail.
                                              Allerdings wird das Script, welches später das Gästebuch füllt, die IP's der einzelnen einträge nicht anzeigen - ich finde das ist Privat und kommt desshalb nicht ins Gästebuch. Dennoch werde ich sie haben, um im Fall der Fälle nicht ohne Informationen da zu stehen.

                                              Merci Struppi

                                              Grüssli Gary

                                        2. Hi Alexander,

                                          -->Nachtrag zu deinem Link:

                                          Nach dem Motto "All Input is Evil-Input!"

                                          Fast wie im richtigen Leben: Vertrauenist gut -Kontrolle ist besser *lol*

                                          Gruß Gary

                                          1. Moin Moin!

                                            Hi Alexander,

                                            -->Nachtrag zu deinem Link:

                                            Nach dem Motto "All Input is Evil-Input!"

                                            Fast wie im richtigen Leben: Vertrauenist gut -Kontrolle ist besser *lol*

                                            oder ganz kurz:

                                            #!/usr/bin/perl -T

                                            ... und schon wird Perl zu einem paranoiden Kontrollfreak. Sehr angenehm, das macht es recht schwierig, sich irgendwelche Injection-Lücken einzufangen. Gegen Dämlichkeiten wie $tainted=~/^(.*)$/s; $untained=$1; hilft das natürlich nicht.

                                            Alexander

                                            --
                                            Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
                                            1. Morgen Alexande

                                              #!/usr/bin/perl -T

                                              Gut habe mich mal ein wenig eingelesen. Dann müsste ich aber alle Variabeln nochmals übergeben, damit sie als "clean" gelten.

                                              Andere Frage:

                                              Anti-XSS-Maßnahmen für HTML ist klar (einigermaßen).

                                              Aber kann jetzt bei meinem Formular z. B. im Namensfeld jeder beliebige Perl-Befehl eingegeben werden, und mein Server würde das nach dem absenden ausführen?

                                              Kann doch nicht sein oder?

                                              Gruß Gary

                                              1. Moin Moin!

                                                Aber kann jetzt bei meinem Formular z. B. im Namensfeld jeder beliebige Perl-Befehl eingegeben werden, und mein Server würde das nach dem absenden ausführen?

                                                Kann doch nicht sein oder?

                                                Das kommt auf den Code an, der die Daten, die der Webserver vom Webbrowser weiterreicht, verarbeitet.

                                                Die Standard-Libraries sehen die Daten als Daten an und reichen sie nicht als Code an den Perl-Interpreter weiter. Was Du mit den Daten anstellst, ist Deine Verantwortung.

                                                Alexander

                                                --
                                                Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
                          2. das Modul kann sehr viel und warum es dir lieber ist HTML code und Perl Code zu vermischen ist seltsam.

                            Ich finde gerade, dass das  CGI HTML und Perl vermischt.
                            Wenn ich mehrheitlich mit Ausgabe-Templates zu tun habe, sehe ich nicht ein, inwiefern erkennbarer = lesbarer HTML-Code in einem Template schlecht sein soll.

                            Zudem zwingt mir CGI einiges anderes auf (ich denke da an Query-String Daten in einem POST Kontext), so dass ich dem Modul in allen ausser den trivialsten Dingen den Arschtritt verpasse.

                            z.b. wird so aus einem Array von Werten, schnell eine HTML Liste erzeugt.

                            use CGI;

                            my @list = qw(a b c d);
                            print CGI::ul( CGI::li(@list) );

                              
                            Ich behalte Autorität über die Formatierung der Ausgabequelle.  
                              
                            print '<ul>',NL,  
                                  map{'<li>'.$\_.'</li>'.NL }@list,  
                                  '<ul>',NL;  
                              
                            
                            > Bei Formularen ist es noch nützlicher, da du dir z.b. keine Gedanken mehr darum machen musst, dass die Werte wieder befüllt werden müssen, wenn jemand etwas fehlerhaft ausgefüllt hat.  
                              
                            Bitte?  
                              
                            mfg Beat
                            
                            -- 
                            
                            ><o(((°>           ><o(((°>  
                            
                               <°)))o><                     ><o(((°>o  
                            Der Valigator leibt diese Fische
                            
                            1. das Modul kann sehr viel und warum es dir lieber ist HTML code und Perl Code zu vermischen ist seltsam.

                              Ich finde gerade, dass das  CGI HTML und Perl vermischt.

                              Wieso? Wenn du das CGI Modul nutzt, schreibst du kein einzige Zeile HTML, sondern nur Funktionen.

                              Wenn ich mehrheitlich mit Ausgabe-Templates zu tun habe, sehe ich nicht ein, inwiefern erkennbarer = lesbarer HTML-Code in einem Template schlecht sein soll.

                              Das ist was anderes, damit trennst du ja Code und HTML. Aber ich hatte jetzt keinen Bock noch zusätzlich auf das nutzen eines Template Moduls zu drängen.

                              Zudem zwingt mir CGI einiges anderes auf (ich denke da an Query-String Daten in einem POST Kontext), so dass ich dem Modul in allen ausser den trivialsten Dingen den Arschtritt verpasse.

                              Keine Ahnung was du mit Query-Daten im Post Kontext meinst. CGI macht in meinen Augen nur die trivialsten Dinge, aber was zwingt mir das Modul auf?

                              z.b. wird so aus einem Array von Werten, schnell eine HTML Liste erzeugt.

                              use CGI;

                              my @list = qw(a b c d);
                              print CGI::ul( CGI::li(@list) );

                              
                              >   
                              > Ich behalte Autorität über die Formatierung der Ausgabequelle.  
                              >   
                              > print '<ul>',NL,  
                              >       map{'<li>'.$\_.'</li>'.NL }@list,  
                              >       '<ul>',NL;  
                                
                              Das ist deutlich länger und wenn noch Eigenschaften, wie z.b. class oder id, hinzukommen, wird es noch unübersichtlich. Wozu NL? Der Browser braucht das nicht.  
                                
                              Und wenn dir persönlich soviel daran liegt, kannst du auch [CGI::Pretty](http://perldoc.perl.org/CGI/Pretty.html) nutzen.  
                                
                              
                              > > Bei Formularen ist es noch nützlicher, da du dir z.b. keine Gedanken mehr darum machen musst, dass die Werte wieder befüllt werden müssen, wenn jemand etwas fehlerhaft ausgefüllt hat.  
                              >   
                              > Bitte?  
                                
                              <http://de.wikipedia.org/wiki/Affenformular>  
                                
                              Struppi.
                              
                            2. Hi Beat,

                              Ist XSS für das CGI im Perl ein Problem oder eher nicht?

                              Gruß Gary

                              1. Ist XSS für das CGI im Perl ein Problem oder eher nicht?

                                Das CGI Modul maskiert nicht automatisch HTML-Spezialzeichen. Du hast selber dafür Sorge zu tragen.

                                mfg Beat

                                --
                                ><o(((°>           ><o(((°>
                                   <°)))o><                     ><o(((°>o
                                Der Valigator leibt diese Fische
      2. Hatten wir nicht schon 2008 ein "or die" Problem oder "Fatals to Browser"-Problem? Mein Perl auf dem Server kennt das wahrscheinlich alles nicht.

        Falls das wirklich so ist und du wirklich nicht vor hast das zu ändern (was ein Fehler wäre), kannst du auch dieses Konstrukt verwenden:

        BEGIN {  
        $SIG{__DIE__} = sub {  
            print "content-type:text/plain\n\n";  
            print "Fehlermeldung:@_\n";  
        };  
        }  
        
        

        Struppi.

  3. Abend nochmal

    Habe im anderen Thread gesehen das dies mit Query_String gehen muss.
    Also

    $alles{'QUERY_STRING'};

    print $alles;

    oder so ähnlich.

    Werde noch ein wenig probieren.

    Gruß Gary

    1. Werde noch ein wenig probieren.

      Solange du die Fehlermeldungen nicht siehst ist das müßig.

      Struppi.

  4. Moin,

    Warum liefert mir der GuestBookManager.pl die Get Daten nicht auf den Clientbrowser aus?

    Warum nimmst Du Perl?

    Horst Ketzer

    1. Hi hotti

      Warum liefert mir der GuestBookManager.pl die Get Daten nicht auf den Clientbrowser aus?

      Warum nimmst Du Perl?

      -Weil ich es schon ein bischen kenne.
      -Weil beim späteren Auslesen der Gästebuchdaten ich weitgehen das "alte" Script von der Hauptseite nutzen kann.
      -Weil ich beim "alten" Script spionieren kann.

      Und zu guter letzt: So langsam habe ich mich an die komplett verdrehte Syntax gewöhnt... :-)

      Gruß Gary

      1. h1,

        Warum nimmst Du Perl?

        -Weil ich es schon ein bischen kenne.
        -Weil beim späteren Auslesen der Gästebuchdaten ich weitgehen das "alte" Script von der Hauptseite nutzen kann.
        -Weil ich beim "alten" Script spionieren kann.

        Und zu guter letzt: So langsam habe ich mich an die komplett verdrehte Syntax gewöhnt... :-)

        Na, wenn das keine Guten Gründe sind ;-)

        Viel Spaß mit Perl!
        Horst Hauptfleisch

      2. hi,

        Und zu guter letzt: So langsam habe ich mich an die komplett verdrehte Syntax gewöhnt... :-)

        Was ich an Perl so schätze ist die Möglichkeit, diese Zeile

        print "Content-type: text/html; charset=UTF-8\n\n";

        selbst ausgeben zu dürfen und das auch mit der richtigen charset-Angabe. Es gibt Programmiersprachen, die machen das spontan und auch noch so, dass Du erst ein Netzwerk-Analyse-Tool anwerfen musst, um zu schauen, ob da auch das kommt, was Deinen Erwartungen entspricht und wenn das nicht der Fall ist, musst Du Dich durch diverse php-Configurationsdateien hangeln bis da endlich ein UTF-8 kommt oder ein ISO-8859-1 oder sonst was.

        Schönen Abend,
        Horst Kleinlaut

        --
        Hast Du Schrank voll Gammelfleisch, kommen viele Fliegen gleisch.