Passwortabfrage
Enzo
- perl
Hi zusammen,
bei meinem Script mach ich ne kleine PW-Abfrage (aber ohne crypt).
Hier der QT:
my %passwd = ("xxx","xxx");
my $u = $cgi->param('username');
my $p = $cgi->param('password');
if (($passwd{$u} eq $p) && ($u ne undef) && ($p ne undef))
{
print $cgi->header (-type => 'text/html');
print "Toll";
exit 0;
}
else
{
print $cgi->header (-type => 'text/html');
print "Shit";
}
Denn ich wollt/hab das mit nem Hash machen, aber hab dann gemerkt, dass wenn der User kein Passwort eingab er dennoch reingekommen ist, deshalb "($u ne undef) && ($p ne undef)". Aber irgendwie hab ich das Gefühl, dass das unsauber ist bzw. da dennoch ein Fehler drin ist. Naja und meine Frage ist jetzt ob man das etwas eleganter machen kann oder es da halt noch ein grobe Lücke gibt ?
cu
Enzo
Hallo,
bei meinem Script mach ich ne kleine PW-Abfrage (aber ohne crypt).
Hier der QT:
my %passwd = ("xxx","xxx");
my $u = $cgi->param('username');
my $p = $cgi->param('password');
if (($passwd{$u} eq $p) && ($u ne undef) && ($p ne undef))
Das ist soweit ganz gut geschrieben!
Außerdem benutzt Du einen Hash!!!
Aber sauberer schreibt man das wohl eher so(, oder?):
my %passwd = ("username" => "passwd");
Wenn Du dir angewöhnst, das mit Kommata zu trennen, wird es bei größeren Gebilden unüberschaubar.
Reiner
Hi,
ich weiss das sich einen Hash benutze :o)
Ich meinte nur, dass mir aufgefallen ist, dass wenn ich dieses ($u ne undef) && ($p ne undef) weg lasse, dann der User trotzdem reinkommt, wenn $p "leer" ist.
Mit sauberer meinte ich eigentlich nicht unbedingt die schreibweise im Hash, sondern eher ob dies wie ich es gemacht habe üblich ist oder man es anderst (besser) hätte machen können.
Aber dennoch danke für den Hinweis :o)
cu
Ento
Hi,
ich weiss das sich einen Hash benutze :o)
Ich meinte nur, dass mir aufgefallen ist, dass wenn ich dieses ($u ne undef) && ($p ne undef) weg lasse, dann der User trotzdem reinkommt, wenn $p "leer" ist.
Mit sauberer meinte ich eigentlich nicht unbedingt die schreibweise im Hash, sondern eher ob dies wie ich es gemacht habe üblich ist oder man es anderst (besser) hätte machen können.
Aber dennoch danke für den Hinweis :o)
Ok, wenn ich es mir nochmal überlege, ist da natürlich ein anderer Fehler drin:
##############
my %passwd = ("xxx","xxx");
my $u = $cgi->param('username');
my $p = $cgi->param('password');
if (($passwd{$u} eq $p) && ($u ne undef) && ($p ne undef))
##############
Nehmen wir an, Du denkst USER="ABC" - PASSWD="XYZ"...
Ich gebe aber USER="123" und PASSWD="UVW" ein.
Dann bildet Deine Abfrage natürlich was Leeres, denn
$passwd{"123"} ist "", was dann auch gleich $p also meinem eingegebenem (leeren) Paßwort entspricht.
Somit ist die Bedingung erfüllt und ich darf weitermachen!!!
Reiner
Ich gebe aber USER="123" und PASSWD="UVW" ein.
^^^
meinte natürlich PASSWD="" - also LEER!
Reiner
Moin!
ich weiss das sich einen Hash benutze :o)
Ich meinte nur, dass mir aufgefallen ist, dass wenn ich dieses ($u ne undef) && ($p ne undef) weg lasse, dann der User trotzdem reinkommt, wenn $p "leer" ist.
Mit sauberer meinte ich eigentlich nicht unbedingt die schreibweise im Hash, sondern eher ob dies wie ich es gemacht habe üblich ist oder man es anderst (besser) hätte machen können.
Eine gute Paßwortabfrage schaut zunächst, ob der eingegebene Username existiert, und dann, ob das zum Usernamen gehörende Paßwort mit der Eingabe übereinstimmt.
So ganz richtig machst du es derzeit also noch nicht, denn die Abfrage $passw{$u} fragt direkt das Paßwort des nicht unbedingt existierenden Users ab.
Die Abfrage, ob kein Username oder kein Paßwort übergeben wurde, macht es schon besser, aber eben noch nicht gut genug. Um Zugang zu erhalten, müssen $u und $p länger als "kein Zeichen" sein (sinnvoll ist, hier generell eine Mindestlänge zu nehmen, die größer als 4 ist, vor allem beim Paßwort mindestens 8 Zeichen), $u muß ein existierender User sein, und dann muß $p mit dem gespeicherten Paßwort übereinstimmen.
- Sven Rautenberg
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/