jakkrull: variablenübergabe an subroutine über html link

Hallo!

Ich hatte vor kurzen hier schon mal gepostet, und das Problem was ich hatte habe ich immer noch. Ich habe einen Link in einer Subroutine und möchte mit diesem Link eine zweite Subroutine aufrufen sowie 2 Variablen übergeben, aber immer wenn ich auf den Link klicke kommen die beiden Variabeln nicht in der nächsten Subroutine an. Mein Link sieht wie folgt aus:

<a href="password.cgi?comment&$name&$pass" >[1] Gästebucheinträge kommentieren</a>

Dabei ist es völlig egal öb das ganze jetzt in "..",'...' oder in gar keinen Hochkommas steht, es funktioniert nicht, die aufgerufende Subroutine erhält keine Variablen. Ich bin mir nicht mal mehr sicher, ob ich die übergebenen Variablen richtig auslesen, ich mache das mit:

sub comment {

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

...

ich wär echt froh wenn mir jemand von euch helfen könnte

Gruß, Jak

P.S. @Struppi das mit den Passwortvariablen hab ich geändert das funktioniert jetzt bestens, danke nochmal für den Tipp mit den hashes daran hatte ich mich gar nicht mehr errinnert ;)

  1. Hi jakkrull,

    das, was Du abfragen musst, heißt QUERY_STRING. Du findest tausend Anleitungen dazu, wie man das Dingen abfragt, zerlegt und weiterverwertet. Oder habe ich Deine Frage falsch verstanden?

    Viele Grüße
    Mathias Bigge

    1. Ola ... danke für die schnellen Antworten! Den Querry String muss ich nicht auslesen der ist ja dafür da wenn ich Daten in Input feldern übergebe, mache ich ja nicht, ich wollte ja direkte Daten an das Skript ranhängen ... ich werd mal schaun ob das mit dem cgi param funktioniert ... übrigens, das Gästebuch ist ja schon alles fertig, ich wollte einfach nur eine kompfortable Möglichkeit für mich und den Rest meiner Band haben an die Einträge Kommentare ranzuhängen bzw. sinnlose Einträge zu löschen. Meine Passwortabfrage ist eigentlich sicher denke ich, weil die Passwortrparameter im Skript selber stehen und auch da verglichen werden. Sie erscheinen erst oben in der URL, wenn das Passwort und der Name bereits authentifiziert sind!

      Schönes Wochenende euch auch,

      Gruß, Jak

  2. Moin!

    <a href="password.cgi?comment&$name&$pass" >[1] Gästebucheinträge kommentieren</a>

    Ich korrigiere das mal:
    href="password.cgi?parameter1=wert1&parameter2=wert2"

    in password.cgi die Parameter auslesen mit dem CGI Modul:

    use CGI 'param';

    my $wert1 = param('parameter1');
    my $wert2 = param('parameter2');

    Security - Hinweis: Übergebe generell keine Parameter, die vertrauliche Inhalte ( ! Passworte) enthalten oder vom Benutzer so manipuliert werden können, dass das CGI Script Dinge tun kann die nicht erwünscht sind. Benutze also CGI Parameter lediglich zum Steuern eines CGI - Scripts, beschränke die Anzahl der Parameter auf einen sinnvollen Wert (*) durch Überlegungen zu einer Kontrollstruktur zum Steuern des CGIs und lege sicherheitsrelevante Variablen direkt in den Code.

    (*): Ein Gästebuch hat im Wesentlichen 2 Zustände:
    1. Einträge (seitenweise) anzeigen
    2. Eintrag erstellen (Post)

    Damit ergibt sich z.B. die folgende einfache Kontrollstruktur:

    if(param()){
     if(param('post')){ # eintrag erstellen }
     else{ fehler('unbekannter Parameter') }
    else{
     # GB anzeigen, browse
    }

    Du siehst also, dass ein einziger Parameter ('post' => Name des Submit-Buttons) hier ausreichend ist, der in der Kontrollstruktur abgefragt wird zum Übergang der Zustände. Es gibt dazu auch viel Geschriebenes im Internet, google mal nach

    • CGI transition model
    • CGI security considerations
      etc.

    schönes WE, Rolf

  3. Ich hatte vor kurzen hier schon mal gepostet, und das Problem was ich hatte habe ich immer noch. Ich habe einen Link in einer Subroutine und möchte mit diesem Link eine zweite Subroutine aufrufen sowie 2 Variablen übergeben, aber immer wenn ich auf den Link klicke kommen die beiden Variabeln nicht in der nächsten Subroutine an. Mein Link sieht wie folgt aus:

    Irgendiwe klingt das als ob du das alles noch nicht verstanden hast.
    Ein Link ist eine HTML ausgabe an den Browser durch klicken auf den Link wird ein CGI aufgerufen, in diesem CGI kannst du die Parameter auslesen (wie gesagt das Modul CGI ist dafür ideal) und dann kannst du in dem Skript irgendwo irgendwas aufrufen.

    <a href="password.cgi?comment&$name&$pass" >[1] Gästebucheinträge kommentieren</a>

    Das Problem ist, das du hier zwar die Werte übergibst, aber nicht mitteilst, um was für Werte es sich handelt.

    Dabei ist es völlig egal öb das ganze jetzt in "..",'...' oder in gar keinen Hochkommas steht, es funktioniert nicht, die aufgerufende Subroutine erhält keine Variablen. Ich bin mir nicht mal mehr sicher, ob ich die übergebenen Variablen richtig auslesen, ich mache das mit:

    sub comment {

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

    Nein, tust du nicht.
    Hier weist du 2 Variabeln die ersten beiden Werte des Arrays @_ zu. CGI Parameter liest du mit CGI::param('nameDesParameters') aus.

    Struppi.

  4. Nochmal einen Nachtrag, du hattest ja gefragt gehabt wie du ein 2. CGI aufrufen kannst.  Das deutet darauf hin, dass du dir nicht klar bist welche Möglichkeiten du hast und wie du dein Skript sinnvoll Konstruieren kannst. Da wir ja mittlerweile mehr Wissen mal ein paar Ideen von mir.

    Also, du willst ein Gästbuch machen mit einem Adminbereich. Den Adminbereich willst du aber nicht im normalen Code mitschleppen. Dazu bnietet sich an, diese Funktionen mit require einzubinden (wobei man sagen muss, dass sich das für so ein Projekt nicht lohnt, da require zur Laufzeit den code übersetzen muss). aber es geht um's Prinzip.

    Nehmen wir an dein skript heißt guest.cgi

    der normale Aufruf ist also: http://doamin.lt/cgi-bin/guest.cgi

    üblicherweise hast du noch einen Parameter, um einzelne Seiten anzeigen zu lassen:
    http://doamin.lt/cgi-bin/guest.cgi?page=1

    um den Adminbereich anzeigen zu lassen willst du eine Usernamen und Passwort Kombination übergeben:
    http://doamin.lt/cgi-bin/guest.cgi?name=XXX&pwd=XXX

    Dein skript könnte dann in etwa so aussehen:

    #!/usr/bin/perl -w

    use strict;
    use CGI;

    my $admin;

    if(CGI::param('name'))
    {
        # Es wurde en Name übergeben
        # also muss der User identifiziert werden
        # da wir das in einem separaten Modul machen wollen
        # muss dieses eingebunden werden.
        require admin.cgi;

    $admin = user_auth( CGI::param('name'), CGI::param('pwd') );

    }

    jetzt kannst du die entsprechenden Optionen über if($admin) anzeigen lassen

    wenn $admin defniert ist, dann ist es eine HASH Referenz

    mit den Schlüsseln ->{name} und ->{pwd}

    show( CGI::param('page'), $admin);

    sub show
    {
        my ($page, $admin) = @_;

    print showPage($page);
        if($admin)
        {
             print CGI::a( {-href => CGI::url() . "?name=$admin->{name}&pwd=$admin->{pwd}" },
             '[1] Gästebucheinträge kommentieren');
        }
    }

    ......

    admin.cgi:
    ------------------------
    my %pwd = {
     user1 => 'pwd1',
     user2 => 'pwd2',
     user3 => 'pwd3',

    ....

    };

    sub user_auth
    {
        my ($name, $pwd) = @_;
        return unless $name;
        return unless $pwd;
        return unless $pwd{$name}; # User unbekannt
        return unless $pwd{$name} ne $pwd; # Passwort falsch

    # wir geben eine Hashreferenz zurück
        return { name => $name, pwd => $pwd };
    }

    1; # um require Glücklich zu machen

    Du kannst natürlich in der admin.cgi auch fehlermeldung ausgeben lassen.

    Struppi.