Struppi: variablenübergabe in anderes cgi script

Beitrag lesen

#!/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.