Moin moin!
my $u = $cgi->param('username');
my $p = $cgi->param('password');
if (($passwd{$u} eq $p) && ($u ne undef) && ($p ne undef))
Da sind zwei Fehler (einer davon doppelt). Erstens wird die Abfrage, ob eine Variable einen definierten Wert hat, so gemacht:
if (defined($p)) ...
Das hast Du fuer $p und $u falsch.
Zweitens vergleichst Du *erst*, ob ($passwd{$u} eq $p und *dann* erst, ob $p und $u ueberhaupt definiert sind. Wenn sie aber nicht definiert sind, wirst Du im ersten Teil schon eine Warnung erhalten (Du hast natuerlich -w eingeschaltet?).
Besser so:
if (
defined($u) && defined($p) &&
length($u) && length($p) &&
defined($passwd{$u}) && $passwd{$u} eq $p
) {
# Fine
} else {
# Wrong
}
Zuerst checken, ob beide Parameter ueberhaupt angegeben sind (defined), dann ob beide aus mehr als 0 Zeichen bestehen (length), dann ob der angegebene Username im Hash existiert und der zugehoerige Wert (das Passwort) definiert ist, und dann endlich, ob das Passwort im Hash mit dem angegebenen uebereinstimmt. length($p) kannst Du evtl. weglassen, wenn Du sicherstellen kannst, dass im Hash kein Passwort mit Nullaenge steht (oder Du das explizit zulassen moechtest).
So long
--
Rule of thumb -- every time Microsoft use the word "smart," be on the lookout for something dumb.
-- http://www.fourmilab.ch/webtools/demoroniser/