CGI-Text einlesen und auf Gleichheit prüfen - Problem
Mike
- cgi
CGI Prob: Das Script liest und checkt nur die erste Zeile, das heisst, dass nur der erste Name
z.B. desson eingelesen und ueberprueft wird. Was fehlt, oder ist falsch, dass das Script alle Zeilen scannt und gegebenenfalls
die Passwortabfrage aktiviert?
-----------------------------
open (pass, "<$user") or &error("Unable to open the User data.");
if ($flock eq "y") {
flock pass, 2;
}
$pass=<pass>;
chop ($pass);
@all = split(/\n/);
close(pass);
$compare=$input{'name'};
$compare=lc($compare);
$compare=~ s/\s//g;
chomp($pass);
@check=split(/|/, $pass);
@check[0]=lc(@check[0]);
@check[0]=~ s/\s//g;
if ($compare eq "@check[0]" and $compare == "@check[0]") {
print "<font color="$other_color" face="$font_face" size="$font_size">Der Name <b>$input{'name'}</b> ist mit einem Passwort versehen.
Bitte geben Sie das Passwort ein, um sich zu authorisieren!<br><br>\n
<b>Passwort:</b><input type="password" name="password"><br><br></font>\n";
}
-----------------------------
$user ist folgendermassen aufgebaut:
desson|YL5GkdLe/ggXg
Albert|Pddf4rLvp1qww
------------------------------------
d.H. jeder Name ist in einer seperaten Zeile.
Danke für eure Hilfe
Hi Mike
CGI Prob: Das Script liest und checkt nur die erste Zeile, das heisst, dass nur der erste Name
$pass=<pass>;
wenn ich meine alles andere als fundierten perl-Kenntnisse zu Rate ziehe würde ich mich zu der Aussage hinreissen lassen, daß Du mit
@pass=<pass>; die ganze Datei in ein Array einlesen kannst.
Dann braucht es halt noch ne Schleife, (macht sich auch besonders gut an großen und teuren Geschenken für lulu ;-) und dann könnte es ein bisschen funktionieren.
Viele Grüße
lulu
Hallo,
open (pass, "<$user") or &error("Unable to open the User data.");
Besser wäre die Verwendung von PASS für den Filehandle, da das sich si eingebürgert hat. Anderen fällt es dann leichter, Deinen Code zu verstehen.
if ($flock eq "y") {
flock pass, 2;
}
$pass=<pass>;
Hier liest Du nur eine Zeile ein ... [1][2]
chop ($pass);
... entfernst das letzte Zeichen von $pass, egal welches ...
@all = split(/\n/);
... und trennst an \n auf, was aber aller Voraussicht nach durch chop entfernt wurde.
Das Ergebnis ist, daß in @all nur eine Element enthalten ist, welches den gleichen Inhalt hat wie $pass. Abgesehen davon, wird @all sowieso nich mehr verwendet.
close(pass);
$compare=$input{'name'};
$compare=lc($compare);
$compare=~ s/\s//g;
chomp($pass);
Hmm, jetzt bin ich verwirrt. Hier entfernst Du wieder das letzte Zeichen aus $pass, aber nur wenn es ein \n (genauer: $/) ist. [2]
@check=split(/|/, $pass);
@check[0]=lc(@check[0]);
@check[0]=~ s/\s//g;
if ($compare eq "@check[0]" and $compare == "@check[0]") {
Mal sehen, wann trifft das zu? Doch nur wenn in $compare und @check[0] eine Zahl steht.
print "<font color="$other_color" face="$font_face" size="$font_size">Der Name <b>$input{'name'}</b> ist mit einem Passwort versehen.
Bitte geben Sie das Passwort ein, um sich zu authorisieren!<br><br>\n
<b>Passwort:</b><input type="password" name="password"><br><br></font>\n";
}
Um alle Zeilen einer Datei abzuarbeiten fallen mir ad hoc zwei einfache Möglichkeiten ein:
1.) Du liest Zeile für Zeile aus, und analysierst diese. Falls Du gefunden hast, was Du suchst, brichst Du das Durchsuchen des Files ab und setzt mit der weiteren Programmabarbeitung fort.
2.) Du liest erst mal alle Zeilen in eine Liste, und durchsuchst diese.
Erstere Variante gefällt mir persönlich besser, da sie mit weniger Speicher und geringerer Ausführungsgeschwindigkeit auskommt, da ja nicht der ganze Inhalt eingelesen wird, wenn die gesuchte Zeile am Anfang der Datei steht.
Hier also mein (grober) Vorschlag
open (PASS, "<$user") or &error("Unable to open the User data.(Reason: $!)");
if ($flock eq "y") {
flock PASS, 2 or &error("Unable to flock the User data.(Reason: $!)");
}
my $compare=lc($input{'name'});
$compare=~ s/\s//g;
my($user,$pass,$found); #ausserhalb der schleife festgelegt um die Daten für weitere Verwendung zu erhalten
$found = 0;
CHECKUSER:
while(<PASS>) # Inhalt der Zeile steht in $_
{
chomp; #entfernt nur \n am Ende der Zeile, falls vorhanden (s.o.)
($user,$pass) = split (/|/,$_,2); # die 2 ist nicht ganz unwichtig, da im Passwortfeld ev. auch | stehen könnte [3]
if ($user eq $compare) #brechen wir ab, wenn wir gefunden haben
{
$found = 1;
last CHECKUSER ;
}
}
close(PASS) or &error("Unable to close the User data. (Reason: $!)")
#ab hier weiter im Programm
if($found)
{
# wir haben den richtigen User gefunden, jetzt machen wir was draus
}
Hier sind noch einige Anmerkungen.
Verwende immer my, um Variablen im Programm einzuführen, und zwar in Verbindung mit 'use strict;'. Das erleichtert die Fehlersuche ungemein, und wird spätestens beim Einsatz von mod_perl unerläßlich.
Im Fehlerfalle solltest Du immer den Fehlercode ($!) berücksichtigen, weil nur dadurch klar wird, warum der Fehler aufgetreten ist.
Grüße
Klaus
[1] sofern Du nicht $/ manipuliert hast.
[2] siehe perldoc perlvar
[3] siehe dazu perldoc -f split