Passwortabfrage

Halihalo,
ich beschäftige mich erst seit kurzem mit Perl und habe jetzt eine
Aufgabe bekommen, wo ich einfach nicht mehr weiter weiß. Ich hoffe,
Ihr könnt mir dabei helfen!
Also,die Aufgabe ist eine kleine Passwortabfrage zu programmieren.
Dazu soll ich einen Hash mit fünf User Namen anlegen, wobei jedem
User ein individuelles Passwort zugeordnet wird. Das Skript soll
zuerst die Abfrage des Usernamens und danach die Eingabe des
Passwortes verlangen.
Ist die Eingabe korrekt, soll das Skript beendet werden und wenn sie
falsch ist,soll die Passwortabfrage bis zur korrekten Eingabe
wiederholt werden.

Naja,theoretisch ist es ja nicht so schwer. Ich habe auch ein
bisschen schon vorgearbeitet und wollte mal sehen,ob das Skript den
ersten Teil,also die Abfrage des Usernamens,richtig anzeigt.Macht es
natürlich nicht!
Ich wollte eine „if-else“ Schleife für die Abfrage des Usernamens
programmieren und eine „while“ Schleife für die Passwortabfrage,aber
als ich die „if-else“ Schleife ausprobieren wollte,klappte es nicht
so wie ich das wollte.
Hier das Skript,das ich bis jetzt programmiert habe:

#!/usr/bin/perl -w
%namen = („Michael“,
„Peter“,
„Thomas“,
„Hans“,
„Andreas“,
„“);
print „Bitte geben Sie Ihren Namen ein.\n“;
$eingabe = 0;
chomp ($eingabe = );
if ($eingabe ne $namen{„Michael||Peter||Thomas||Hans||Andreas“})
{
print „Bitte geben Sie Ihr Passwort ein.\n“;

}
else
{
print „Sie haben sich nicht registriert.Skript wird beendet\n“;
}

Wäre super,wenn ihr mir weiterhelfen könntet!

Gruß

Hallo,

> #!/usr/bin/perl -w  
> %namen = ("Michael",  
> "Peter",  
> "Thomas",  
> "Hans",  
> "Andreas",  
> "");

#hier hast du ein Hash %namen deklariert, aber 
#du verwendest es wie ein Array. Was hältst du von
# my %namen = ("Michael" =\> "MichisPasswort",
# "Peter" =\> "PetersPasswd",...



> print "Bitte geben Sie Ihren Namen ein.\n";  
> $eingabe = 0;  
> chomp ($eingabe = );  
> if ($eingabe ne  
> $namen{"Michael||Peter||Thomas||Hans||Andreas"})

# das geht dann besser mit 
# if(defined($namen{$eingabe})){


> {  
> print "Bitte geben Sie Ihr Passwort ein.\n";

# und dann hier passwort abfragen:
# my $passwd = ;
# chomp $passwd;
# if ($namen{$eingabe}=$passwd){...


> }  
> else  
> {  
> print "Sie haben sich nicht registriert.Skript wird  
> beendet\n";  
> }

Wäre super,wenn ihr mir weiterhelfen könntet!

s.o.

Du solltest dir angewöhnen deine Variablen (mit my) zu deklarieren und am Anfang ein

use strict;
use warnings;

einzufügen - das hilft sehr viel beim Fehlersuchen und -vermeiden.

Grüße,
Moritz

Hi,

also die Namensabfrage funktioniert schonmal echt gut, aber die
Passwortabfrage noch nicht so wirklich. Denn momentan kann ich jedes
beliebige Passwort eingeben, es erscheint immer „Herzlich
willkommen“.
Wie ordne ich die einzelnen Passwörter den Usern zu, sodass sich z.B.
"Michael"auch nur mit „mtest“ anmelden kann?
Ich habe schon selbst experimentiert,aber es klappt bis jetzt noch
nicht.
Falls ein falsches Passwort eingegeben wird, soll das Skript solange
wiederholt werden, bis das richtige Passwort eingegeben wird.
Dabei habe ich mir folgendes überlegt:

$passwort = „test“;
$passwort1 = ;
chomp $passwort1;
while ($passwort1 ne $passwort)
{
print „Falsches Passwort. Bitte noch einmal versuchen:\n“;
$passwort1 = ;
chomp $passwort1;
}

Kann man das so stehen lassen,oder gibt es eine bessere Möglichkeit?
Achja, hier noch einmal das geänderte Skript, wo die Passwortabfrage
noch nicht
richtig funktioniert:

#!/usr/bin/perl -w
use strict;
use warnings;
my %namen = („Michael“ => „mtest“,
„Peter“ => „ptest“,
„Thomas“ => „ttest“,
„Hans“ => „htest“,
„Andreas“ => „atest“,
„“);
print „Bitte geben Sie Ihren Namen ein.\n“;
my $eingabe = ;
chomp $eingabe;
if(defined($namen{$eingabe}))
{
print „Bitte geben Sie Ihr Passwort ein.\n“;
my $passwd = ;
chomp $passwd;
if ($namen{$eingabe}=$passwd)
{
print „Herzlich willkommen.\n“;
}
}
else
{
print „Sie haben sich nicht registriert.\n“;
}

Vielen Dank schonmal für die Mühe!!

Gruß

Hallo Frank,
ich habe grad keinen Perl-Interpreter zur Hand, deswegen kann ich dir zwar einen Vorschlag für ein Progrämmchen machen, es aber nicht testen *g*.
ich würde das etwa so machen:

#!/usr/bin/perl 
use strict;
use warnings;
my %users = ("Frank" =\> "i learn perl", "Moritz"=\>"stupidPasswd");
my $u = "";
my $passwd = "";

$u = ;
chomp $u;
if (defined($users{$u}){
 # User existiert
 print "welcome $u, please enter your password: ";
 while ($users{$u} ne $passwd){
 $passwd = ;
 chomp $passwd;
 }
 print "login correct\n";
 # hier alles moegliche tun, was du halt brauchst...
} else {
 print "Sorry, username $u could not be found.\n";
 print "please register befor using our great service\n";
}

wobei ich es für eine Sicherheitslücke halte erst den Benutzernamen zu prüfen, aber darum geht es dir vermutlich nicht.

Ein Testlauf sollte so aussehen:

obscureuser
Sorry, username obscureuser could not be found.
please register befor using our great service


> exit


Moritz
welcome Moritz, please enter your password: bla
blubb
stupidPasswd
login correct

Das kann man natürlich noch deutlich ausfeilen, aber für ein erstes Beispiel sollte es reichen…

Viele Grüße,
Moritz

Hallo Frank,

Denn momentan kann ich jedes
beliebige Passwort eingeben, es erscheint immer „Herzlich
willkommen“.

Na Klar! weil du nämlich netterweise genau hier:

print „Bitte geben Sie Ihr Passwort ein.\n“;
my $passwd = ;
chomp $passwd;
if ($namen{$eingabe}=$passwd)
{
print „Herzlich willkommen.\n“;
}

das Passwort nicht überprüfst, sondern neu setzt, gell! :smile:

(es sollte eher sowas wie
if ($namen{$eingabe} ~= $passwd) sein, oder halt wie in deiner neuen Version mit ne)

Gruß,
evanovka

Halihalo,

das Skript habe ich jetzt umgeändert und mit einer „while-Schleife“ versehen,
damit die Passwortabfrage für die User solange erscheint, bis das richtige
Passwort erscheint. Es klappt zum Glück auch alles,allerdings erhalte ich
zwei Fehlermeldungen. Das Skript kann ich aber dennoch ausführen.
Fehlermeldung Nr.1:
Wenn ich das Skript mit „perl -w 4.pl“ aufrufe, erscheint die Fehlermeldung
„Odd number of elements in hash assignment at 4.pl line 3.“

Fehlermeldung Nr.2:
Bei der Passwortabfrage erscheint, wenn es ein falsches Passwort ist:
„Use of uninitialized value in string eq at 4.pl line 18, line 2.
Use of uninitialized value in string ne at 4.pl line 22, line 2.“

Hier noch einmal das gesamte Skript:

#!/usr/bin/perl -w

my %namen = („Michael“ => „mtest“,
„Peter“ => „ptest“,
„Thomas“ => „ttest“,
„Hans“ => „htest“,
„Andreas“ => „atest“,
„“);
print „Bitte geben Sie Ihren Namen ein.\n“;
my $eingabe = ;
chomp $eingabe;
if(defined($namen{$eingabe}))
{
print „Bitte geben Sie Ihr Passwort ein.\n“;
my $passwd = ;
chomp $passwd;
}
if ($namen{$eingabe} eq $passwd)
{
print „Herzlich willkommen.\n“;
}
while ($namen{$eingabe} ne $passwd)
{
print „Falsches Passwort. Bitte noch einmal versuchen:\n“;
$passwd = ;
chomp $passwd;
}
if ($namen{$eingabe} eq $passwd)
{
print „Herzlich willkommen.\n“;
}

Tragisch sind die Fehlermeldungen nicht,weil das Skript dennoch ausgeführt
wird,aber es interessiert mich schon,woran das liegt,denn ich hatte diese
Meldungen schon öfters.

Gruß

Hallo Frank,

„Odd number of elements in hash assignment at 4.pl line 3.“

d.h. dein Hash sollte ja eigentlich aus lauter Key-Value-Paaren bestehen und deswegen eine gerade Anzahl an Elementen enthalten, was er aber offensichtlich nicht tut:

my %namen = („Michael“ => „mtest“,
„Peter“ => „ptest“,
„Thomas“ => „ttest“,
„Hans“ => „htest“,
„Andreas“ => „atest“,
"");

Bei der Passwortabfrage erscheint, wenn es ein falsches
Passwort ist:
„Use of uninitialized value in string eq at 4.pl line 18,
line 2.
Use of uninitialized value in string ne at 4.pl line 22,
line 2.“

Wenn du auch noch die Zeilennummern bei deinem Skript mitschreiben würdest… wär ziemlich hilfreich! :wink:

print „Bitte geben Sie Ihren Namen ein.\n“;
my $eingabe = ;
chomp $eingabe;
if(defined($namen{$eingabe}))
{
print „Bitte geben Sie Ihr Passwort ein.\n“;
my $passwd = ;
chomp $passwd;
}

if ($namen{$eingabe} eq $passwd)
{
print „Herzlich willkommen.\n“;
}
while ($namen{$eingabe} ne $passwd)
{
print „Falsches Passwort. Bitte noch einmal versuchen:\n“;
$passwd = ;
chomp $passwd;
}
if ($namen{$eingabe} eq $passwd)
{
print „Herzlich willkommen.\n“;
}

Die doppelte if-Schleife würde ich kürzen (die erste weglassen, mit der while-Schleife anfangen: wenn die Bedingung der while-Schleife nicht erfüllt ist, kommt ja automatisch als nächster Schritt die if-Schleife)

Ach ja, mir ist noch was aufgefallen: was passiert, wenn sich jemand anmelden will, der gar nicht in der Liste steht, also z.B. Jan.
Die erste Abfrage nach

if(defined($namen{$eingabe}))

wird nicht erfüllt, d.h. der Block

{
print "Bitte geben Sie Ihr Passwort ein.\n";
my $passwd = ;
chomp $passwd;
}

wird nicht ausgeführt.
Die if- und while-Schleifen aber schon! Und weil $namen{Jan} nicht definiert ist, könnte man mit einem „undefiniertem“ Passwort trotzdem reinkommen, oder seh ich da was falsch?!
Also lieber die Passwort-Abfrage in den Block nach der Identifikation integrieren!
Hm… ob das alles jetzt was mit der Fehlermeldung zu tun hat ist mir nicht 100%ig klar … aber eine ordentliche Loop-Struktur ist immer gut beim debuggen :wink:

grüße,
evanovka