Jak'Krull: variablenübergabe in anderes cgi script

Hallo!

Ich habe mal eine Frage. Man kann Variablen innerhalb eines CGi Scriptes ja problemlos hin und her übergeben, aber geht das auch in ein anderes script hinein?? Ich habe jetzt schon mehrere Sachen versucht (versuchen auszulesen, in neues script sub geschrieben und an die sub übergeben,...) und nix hat funktiobiert ... geht das überhaupt, und wenn ja wie ?? Hab leider bis jetzt in diesem Forum nix dazu gefunden.

Gruß, Fabian

  1. Ich habe mal eine Frage. Man kann Variablen innerhalb eines CGi Scriptes ja problemlos hin und her übergeben, aber geht das auch in ein anderes script hinein?? Ich habe jetzt schon mehrere Sachen versucht (versuchen auszulesen, in neues script sub geschrieben und an die sub übergeben,...) und nix hat funktiobiert ... geht das überhaupt, und wenn ja wie ?? Hab leider bis jetzt in diesem Forum nix dazu gefunden.

    Bist du sicher, das du ein neues CGI Skript aufrufen musst? Ich vemrute dein Skript liegt auf dem gleichen Servern, in diesem Falle ist es besser die Datei mit require oder use einzubinden und die gewünschte Funktion aufzurufen.

    ansonsten, kannst du ein Weiterleitung machen CGI::redirect('....');

    Struppi.

    1. Nun gut wenn ich genauer darüber nachdenke, ist es wirklich Quatsch dafür eine extra Datei anzulegen. Nun tritt aber ein zweites Problem auf, bei dem ich nicht weiß, wieso.

      Um kurz zu beschreiben worum es geht. Ich will für mich ein Script haben mit dem ich und andere die berechtigt sind Gästebucheinträge auf meiner Seite zu kommentieren oder, wenn nicht gewollt, zu löschen. Dafür habe ich ein Passworteingabe Skript geschrieben welches Name und Passwort an das Skript übermittelt, welches gleich weiter unten steht.
       In dem Skript welches weiter unten steht tritt aber nun folgender Fehler auf. Wenn ich mich eingeloggt habe (im moment noch mit name=n, passwort=p möglich), habe ich eine Link-Auswahl ob ich Einträge löschen oder kommentieren möchte, komischer weise ruft er aber nicht die "sub comment" oder "sub delete" auf sondern springt immer auf die sub in der der Benutzer darauf hingewiesen wird, das er keinen  Namen eingegeben hat.

      Vielleicht hat ja einer von euch ne Ahnung woran das liegen könnte.
      Hier das Skript:

      #!/usr/bin/perl -w

      use strict;
      use CGI::Carp qw(fatalsToBrowser);

      #globale variablen
      my $file   = 'pass.cgi';
      my $buffer;
      my $name = $_;
      my $pass = $_;

      #passwort variablen
      my $pw1_jak   = ("np");
      my $pw2_jak;
      my $pw1_tobi  = ("np");
      my $pw2_tobi;
      my $pw1_micha = ("np");
      my $pw2_micha;
      my $pw1_horn  = ("np");
      my $pw2_horn;
      my $pw1_uwe   = ("np");
      my $pw2_uwe;

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

      #auslesen und splitten der passwortdaten
      read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});

      ($a,$b) = split(/&/,$buffer);
      ($a,$name) = split(/=/,$a);
      ($b,$pass) = split(/=/,$b);

      #erstellen der vergleichspasswortdaten
      $pw2_jak   = $name.$pass;
      $pw2_tobi  = $name.$pass;
      $pw2_micha = $name.$pass;
      $pw2_horn  = $name.$pass;
      $pw2_uwe   = $name.$pass;

      #sicherheitsabfrage ob name oder passwort eingegeben worden sind
      &no_name unless $name;
      &no_pass unless $pass;

      #sind passwort und username korrekt ???
      if ($pw1_jak eq $pw2_jak || $pw1_tobi eq $pw2_tobi || $pw1_micha eq $pw2_micha || $pw1_horn eq $pw2_horn || $pw1_uwe eq $pw2_uwe) {

      &confirmed($name,$pass);
      }
      else {

      &no_acc;
      exit ();
      }

      #eingeloggte mitglieder können hier auswählen was sie nun tun wollen
      sub confirmed {

      my $name=$name;
      my $pass=$pass;

      print <<ende;

      <html>
      <head>
      <title>confirm_pass</title>
      <LINK REL=STYLESHEET HREF=/asparagoth.css TYPE=text/css>
      </head>
      <body bgcolor="000000" text="#A89F9A" background="../pics/main/main.jpg" bgproperties="fixed">

      <p>Herzlich willkommen $name, Du bist eingeloggt!!</br>
      Was möchtest du jetzt machen??</p>
      <br>
      <p>
      <a href='password.cgi?comment&$name' >[1] Gästebucheinträge kommentieren</a><br>
      <a href='password.cgi?delentry&$name'>[2] Gästebucheinträge löschen</a></p>
      <br>
      <br>
      <center><a href=$file>zurück</a></center>
      </body>
      </html>

      ende

      exit();
      }

      #wird aufgerufen, wenn der user nicht erkannt wurde
      sub no_acc {

      print "<html>";
      print "<head>";
      print "<title>confirm_pass</title>";
      print "<LINK REL=STYLESHEET HREF=/asparagoth.css TYPE=text/css>";
      print "</head>";
      print "<body bgcolor=000000 text=#A89F9A background=../pics/main/main.jpg bgproperties=fixed>";

      print "<p>Sorry, aber dieser Account existiert nicht!!</p>";

      print "<br>";
      print "<center><a href=$file>zurück</a></center>";
      print "</body>";
      print "</html>";

      exit();
      }

      #wird aufgerufen, wenn kein benutzername eingegeben wurde
      sub no_name {

      print "<html>";
      print "<head>";
      print "<title>confirm_pass</title>";
      print "<LINK REL=STYLESHEET HREF=/asparagoth.css TYPE=text/css>";
      print "</head>";
      print "<body bgcolor=000000 text=#A89F9A background=../pics/main/main.jpg bgproperties=fixed>";
      print "<p>Bitte gebe einen Namen ein!!";

      print "<br>";
      print "<center><a href=$file>zurück</a></center>";
      print "</body>";
      print "</html>";

      exit();
      }

      #wird aufgerufen, wenn kein passwort eingegeben wurde
      sub no_pass {

      print "<html>";
      print "<head>";
      print "<title>confirm_pass</title>";
      print "<LINK REL=STYLESHEET HREF=/asparagoth.css TYPE=text/css>";
      print "</head>";
      print "<body bgcolor=000000 text=#A89F9A background=../pics/main/main.jpg bgproperties=fixed>";
      print "<p>Bitte gebe ein Passwort ein!!";

      print "<br>";
      print "<center><a href=$file>zurück</a></center>";
      print "</body>";
      print "</html>";

      exit();
      }

      #wird aufgerufen, wenn in der sub "confirmed" der punkt [1] Eintrag bearbeiten ausgewählt wurde
      #soll GB-Einträge kommentieren lassen können
      sub comment {

      my $name = $name;

      print <<ende;

      <html>
      <head>
       <title>Asparagoth - Internal</title>
       <LINK REL=STYLESHEET HREF="/standart.css" TYPE="text/css">
      </head>
      <body bgcolor="000000" background="../pics/main/main.jpg" bgproperties="fixed">

      <br>
      <br>

      <p> Diese Funktion ist im Moment noch nicht im Betrieb!!</p>

      <p> der name ist: $name </p>

      <br>
      <br>

      <center><a href='password.cgi?confirmed&$name'>zurück</a></center>

      </body>
      </html>

      ende

      exit();
      }

      #wird aufgerufen, wenn in der sub "confirmed" der Punkt [2] Eintrag löschen ausgewählt wurde ...
      #soll GB-Einträge löschen die vorher ausgewählt wurden
      sub delentry {

      my $name = $name;

      print <<ende;

      <html>
      <head>
       <title>Asparagoth - Internal</title>
       <LINK REL=STYLESHEET HREF="/standart.css" TYPE="text/css">
      </head>
      <body bgcolor="000000" background="../pics/main/main.jpg" bgproperties="fixed">

      <br>
      <br>

      <p> Diese Funktion ist im Moment noch nicht im Betrieb!!</p>

      <p> der name ist: $name </p>
      <p> das passwort ist: $pass </p>

      <br>
      <br>

      <center><a href='password.cgi?confirmed&$name'>zurück</a></center>

      </body>
      </html>

      ende

      exit();
      }

      exit();

      Gruß, JakKrull

      1. &confirmed($name,$pass);

        Warum steht hier nen & vor dem confirmed ??

        &no_acc;

        Und hier auch ???

        Ruft man Subroutinen nicht ohne & auf ???

        1. Wenn ich das ohne mache dann gehts nicht ... das ist auch gar nicht der Fehler das funktioniert alles soweit ganz gut, dass einzige Problem ist wirklich das er bei <a href='password.cgi?comment&$name' >[1] Gästebucheinträge kommentieren</a><br> nicht auf die richtige sub Routine springt und ich habe keine Ahnung woran das liegen könnte.

          Gruß, Jak

      2. <a href='password.cgi?comment&$name' >[1] Gästebucheinträge

        müssen das nicht doppelte Hochkomma sein?

        <a href="password.cgi?comment&$name" ></a>

        Viele Grüße,
        coolblue

        --

        never say oops after you submitted a job :-)
        _der_Ton_macht_die_Musik_!!!_
      3. #!/usr/bin/perl -w

        use strict;
        use CGI::Carp qw(fatalsToBrowser);

        #globale variablen
        my $file   = 'pass.cgi';
        my $buffer;
        my $name = $_;
        my $pass = $_;

        #passwort variablen
        my $pw1_jak   = ("np");
        my $pw2_jak;
        my $pw1_tobi  = ("np");
        my $pw2_tobi;
        my $pw1_micha = ("np");
        my $pw2_micha;
        my $pw1_horn  = ("np");
        my $pw2_horn;
        my $pw1_uwe   = ("np");
        my $pw2_uwe;

        Mir ist nicht ganz klar was das darstellen soll. Ich vermute du hast für mehrere Nutzer unterschiedliche Passwörter (da ist aber dein Vergleich später falsch). Umsetzen läßt sich dies wesentlich eleganter mit einem HASH.

        my %pwd = (
        jak => '...',
        tobi => '....',
        micha => '....',
        ...
        );

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

        #auslesen und splitten der passwortdaten
        read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});

        Es gibt ein Prima Modul für CGI Anwendungen, es heißt CGI und beinhaltet fast alles was für ein Perl CGI skript gebraucht wird. Da es schon lange im Einsatz ist und sicher tausendfach getestet solltest du es verwenden, sowohl für die Ausgabe als auch für die Eingabe.

        Gerade HTML Tabellen und Formulare lassen sich damit sehr einfach erstellen.

        Hier in diesem Fall kann es zu Problemen kommen, wenn die Eingaben ein anderes Zeichen als Buchstaben oder Zahlen enthalten (z.b. ein Leerzeichen), da diese vom browser Codiert werden und entsprechend wieder decodiert werden müssen. Das alles erledigt das Modul automatisch für dich.

        ($a,$b) = split(/&/,$buffer);
        ($a,$name) = split(/=/,$a);
        ($b,$pass) = split(/=/,$b);

        #erstellen der vergleichspasswortdaten
        $pw2_jak   = $name.$pass;
        $pw2_tobi  = $name.$pass;
        $pw2_micha = $name.$pass;
        $pw2_horn  = $name.$pass;
        $pw2_uwe   = $name.$pass;

        Das ist Humbug.

        Mal angenommen du gibst dem Skript zwei Parameter;

        script.pl?name=name&pwd=passwort

        Dann kommst du so an die Daten:

        my $name = CGI::param('name');
        my $pass = CGI::param('pwd');

        #sicherheitsabfrage ob name oder passwort eingegeben worden sind
        &no_name unless $name;
        &no_pass unless $pass;

        Das wäre dann noch ok, aber mit dem oben vorgschlagenen HASH würde die Abfrage dann z.b. so aussehen:

        if ($pwd{$name} && $pwd{$name} eq $pass) {
        confirmed($name,$pass);
        }
        else {
        no_acc;
        }

        Das '&' vor Funktionen ist Perl 4 Style, du brauchst es nur, wenn du den Parameter @_ weitereichen möchtest.

        exit sollte man übrigens vermeiden

        print <<ende;

        <html>
        <head>
        <title>confirm_pass</title>
        <LINK REL=STYLESHEET HREF=/asparagoth.css TYPE=text/css>
        </head>
        <body bgcolor="000000" text="#A89F9A" background="../pics/main/main.jpg" bgproperties="fixed">

        <p>Herzlich willkommen $name, Du bist eingeloggt!!</br>
        Was möchtest du jetzt machen??</p>
        <br>
        <p>
        <a href='password.cgi?comment&$name' >[1] Gästebucheinträge kommentieren</a><br>
        <a href='password.cgi?delentry&$name'>[2] Gästebucheinträge löschen</a></p>
        <br>
        <br>
        <center><a href=$file>zurück</a></center>
        </body>
        </html>

        ende

        wie gesagt das CGI Modul hilft dir hier zu vermeiden HTML Code im Perl Code zu haben, was immer unschön aussieht un das Programm unübersichtlich macht, außerdem hilft es dir Verschachtelungsfehler zu vermeiden.

        Du könntest das obige ersetzen durch (ich hab mal die unsinnigen HTML Angaben ersetzt, du solltest dich mal mit CSS auseinadersetzen um HTML Formtierungen wie bgcolor oder das Font-Tag wegzuschmeissen):

        print  CGI::start_html(
        -title => 'confirm_pass',
        -head => CGI::Link({ -rel=>'stylesheet', -type=>'text/css', -href => "/asparagoth.css"})
        ),

        CGI::p("Herzlich willkommen $name, Du bist eingeloggt!!<br>Was möchtest du jetzt machen??"),

        CGI::p(
        CGI::a({-href => "password.cgi?comment&$name"},'[1] Gästebucheinträge kommentieren</a>')
        . CGI::br()
        . CGI::a({ -href =>"password.cgi?delentry&$name"}, '[2] Gästebucheinträge löschen')
        ),
        CGI::a({-href =>$file}, 'zurück')
        ;

        Struppi.