Homepage Inspire-world | Forum
CGI/Perl Workshops Dateien mit Passwortschutz

 Inhaltsverzeichnis/Workshops Übersichtsseite/Dateien mit Passwortschutz
In diesem Workshop soll es darum gehen ein Script mit einem Passwortzugang zu versehen und das Script auch so aufzuteilen das der Administrator und der User das Script benutzen können aber in getrennte Subroutinen geleitet werden. Dies kann nützlich sein wenn man Statistiken anbietet die der Administrator verwaltet, der User aber nur einsehen darf. In dem ersten Workshoptei ist das Script noch sehr, sehr einfach gehalten, im zweiten Teil werde ich dann Header und Footer sowie eine Error Routine hinzufügen.

Einige Sachen sind hier Direkt im Script selbst erklärt, auf einiges komme ich aber unterhalb des Scriptes nocheinmal zu sprechen.

1. Hier zunächst das komplette Script (Workshopteil 1)

#!/usr/bin/perl

# Angabe das hier CGI Prameter genutzt werden
use CGI qw(param);

######################################################
# Das Passwort für den Admin
$password = "Admin";
# Das Passwort für den User
$userp = "User";

######################################################
# Variablendefinition von $action
# Es wird hier festgelegt bei welcher Aktion 
# welche Subroutine aufgerufen wird
$action = param('action');

######################################################
# Die action Parameter.
# Bei keinem Parameter (eq "") wird der Login aufgerufen
if ($action eq ""){&administratorlogin}
elsif ($action eq "login"){&startseite}
elsif ($action eq "zweiteseite"){&seitezwei}
elsif ($action eq "user"){&userdaten}


######################################################
sub administratorlogin {
print "Content-type: text/html\n\n";
print qq~

<form action="pass.pl" method="post">
<input type="hidden" name="action" value="login">
<b>Administratorlogin</b><br>
Passwort <input type="passwort" name="password" size="15"> "<b>Admin</b>" zum Login benutzen
<br><br>
<input type="Submit" value="Einloggen"></td>
</form>
<br><br>
<hr>
    
<form action="pass.pl" method="post">
<input type="hidden" name="action" value="user">
<b>User Login</b><br>
Passwort <input type="passwort" name="userp" size="15"> "<b>User</b>" zum Login benutzen
<br><br>
<input type="Submit" value="Einloggen"></td>
</form>

~;
exit;
}


######################################################
sub startseite {

# Parameterdefinition für das zu übergebende Passwort
$pass = param("password");

# Entspricht das Passwort dem Passwort
if ($password eq $pass) {


print "Content-type: text/html\n\n";

print qq~
<html>
<head><title>Erste Seite nach Login</title></head>
<body>
Das ist die erste Seite nach dem Login<br>
<form action="pass.pl" method="post">
<input type="hidden" name="action" value="zweiteseite">
<input type="hidden" name="password" value="$pass">
<input type="Submit" value="Weiter zu Subroutine 2">
</body>
</html>

~;
}

else {
# Fehlermeldung bei ungültigen Daten
print qq~
<html>
<head><title>Erste Seite nach Login</title></head>
<body>
Das ist die Fehlermeldung wenn ungültige Dateneingegeben wurden
</body>
</html>
~;
}
}

######################################################
sub seitezwei {


# Parameterdefinition für das zu übergebende Passwort
$pass = param("password");

# Entspricht das Passwort dem Passwort
if ($password eq $pass) {


print "Content-type: text/html\n\n";
print qq~
<html>
<head><title>Zweite Seite nach Login</title></head>
<body>
Das ist die zweite Seite nach dem Login<br>
<form action="pass.pl" method="post">
<input type="hidden" name="action" value="login">
<input type="hidden" name="password" value="$pass">
<input type="Submit" value="Zurück zur Startseite"><br><br>
</body>
</html>
~;

} else {
# Fehlermeldung bei ungültigen Daten
print qq~
<html>
<head><title>Erste Seite nach Login</title></head>
<body>
Das ist die Fehlermeldung wenn ungültige Daten eingegeben wurden
</body>
</html>
~;
}
}

######################################################
sub userdaten {

# Parameterdefinition für das zu übergebende Passwort
# Achtung, hier sind andere Variablen anzuwenden
$pass = param("userp");

# Entspricht das Passwort dem Passwort
# Achtung, hier sind andere Variablen anzuwenden
if ($userp eq $pass) {


print "Content-type: text/html\n\n";
print qq~
<html>
<head><title>Userbereich</title></head>
<body>
Das ist der Userbereich
</body>
</html>
~;

} else {
# Fehlermeldung bei ungültigen Daten
print qq~
<html>
<head><title>Erste Seite nach Login</title></head>
<body>
Das ist die Fehlermeldung wenn ungültige Daten eingegeben wurden
</body>
</html>
~;
}
}
Script Demo: Passwort.pl

Erläuterungen zum Script:

Im Gegensatz zu den ersten beiden Beispielen verwenden wir hier schon getrennte Subroutinen für die unterschiedlichen Bereiche des Scriptes. Subroutinen werden immer mit einem sub userdaten { sub = Hier fängt eine Subroutine an + userdaten = Name der Subroutine. Das Ende einer Subroutine ist wieder eine geschweifte Klammer }

sub userdaten { 
# Inhalte der Subroutine
} # Ende der Subroutine
Subroutinen sind in der Hinsicht praktisch weil diese auch in anderen Scriptteilen aufgerufen werden können. So wäre es z.B. kein Problem wenn in allen Script Subroutinen Mails versendet werden sollten dies über eine einzige Subroutine abzuwickeln. Genauso das Thema Header und Footer oder Scriptfehlermeldungen uvam. können in Subroutinen platziert werden um dann nach Bedarf aktiviert zu werden.

Hat der Admin/User denn das richtige Passwort eingegeben?

Um zu prüfen ob denn die Daten auch OK sind müssen die Parameter zum erreichen einer Subroutine jeweils mit Hidden Feldern übergeben werden.
<input type="hidden" name="action" value="login">
<input type="hidden" name="password" value="$pass">
Geprüft wird das ganze dann innerhalb der Subroutine mittels der if Abfrage if ($password eq $pass) { "Wenn Passwort dem Passwort entspricht dann gib die Daten der Subroutine frei, bei Fehlern jedoch verzweige per
} else {
# Fehlermeldung bei ungültigen Daten
print qq~
Das ist die Fehlermeldung wenn ungültige Daten eingegeben wurden
~;
}
}
auf die Fehlermeldung. Bitte die beiden geschweiften Klammern am Ende beachten!

Wer sich dies Script zu Gemüte führt wird schnell erkennen das dies sehr variablen aufgebaut sein kann. Beliebige Subroutinen für neue Scriptfunktionen oder auch das einbinden externer Subroutinen stellt nicht das Problem dar. Ich empfehle jedem ersteinmal mit diesem Script ausgiebig zu experimentieren bevor der nächste Teil in angriff genommen wird. Gute Möglichkeiten sind hier das einbinden des ENV Scriptes oder kleinerer Sachen wie die des ersten Workshops.


2. Workshopteil 2, das Script weiter ausbauen

#!/usr/bin/perl

# Angabe das hier CGI Prameter genutzt werden
use CGI qw(param);

######################################################
# Das Passwort für den Admin
$password = "Admin";
# Das Passwort für den User
$userp = "User";

######################################################
# Variablendefinition von $action
# Es wird hier festgelegt bei welcher Aktion 
# welche Subroutine aufgerufen wird
$action = param('action');

######################################################
# Die action Parameter.
# Bei keinem Parameter (eq "") wird der Login aufgerufen
if ($action eq ""){&administratorlogin}
elsif ($action eq "login"){&startseite}
elsif ($action eq "seitezwei"){&seitezwei}
elsif ($action eq "seitedrei"){&seitedrei}
elsif ($action eq "seitevier"){&seitevier}
elsif ($action eq "user"){&userdaten}
elsif ($action ne "login" or "seitezwei" or "seitedrei" or "seitevier"){&errorroutine}

# Die obere Zeile ist eine kleine zusätzliche Sicherheit
# wird das Script mit anderen als den hier notierten Parametern
# aufgerufen heisst das den Aufruf der Subroutine
# sub errorroutine zu veranlassen. Da für den Userteil eine eigene
# Fehlerprüfung eingebaut ist ist hier der Parameter user nicht mit gelistet

######################################################
sub administratorlogin {
print "Content-type: text/html\n\n";
print qq~

<form action="pass2.pl" method="post">
<input type="hidden" name="action" value="login">
<b>Administratorlogin</b><br>
Passwort <input type="passwort" name="password" size="15"> "<b>Admin</b>" zum Login benutzen
<br><br>
<input type="Submit" value="Einloggen"></td>
</form>
<br><br>
<hr>
    
<form action="pass2.pl" method="post">
<input type="hidden" name="action" value="user">
<b>User Login</b><br>
Passwort <input type="passwort" name="userp" size="15"> "<b>User</b>" zum Login benutzen
<br><br>
<input type="Submit" value="Einloggen"></td>
</form>
~;
exit;
}


######################################################
sub startseite {

# Parameterdefinition für das zu übergebende Passwort
$pass = param("password");

# Entspricht das Passwort dem Passwort
if ($password eq $pass) {
# Hier wird nun die subroutine "sub header" eingebunden.
&header;
print qq~
Das ist die erste Seite nach dem Login<br>
Hier können dann weitere beliebige Operationen ausgeführt werden.
~;
&footer;
# Hier wird nun die subroutine "sub footer" eingebunden.
} else{
&errorroutine
}
}

######################################################
sub seitezwei {

# Parameterdefinition für das zu übergebende Passwort
$pass = param("password");

# Entspricht das Passwort dem Passwort
if ($password eq $pass) {


# Hier wird nun die subroutine "sub header" eingebunden.
&header;
print qq~
Das ist die zweite Seite nach dem Login<br>
Hier können dann weitere beliebige Operationen ausgeführt werden.
~;
&footer;
# Hier wird nun die subroutine "sub footer" eingebunden.

} else {
&errorroutine;
}
}

######################################################
sub seitedrei {

# Parameterdefinition für das zu übergebende Passwort
$pass = param("password");

# Entspricht das Passwort dem Passwort
if ($password eq $pass) {
# Hier wird nun die subroutine "sub header" eingebunden.
&header;
print qq~
Subroutine 3<br>
Hier können dann weitere beliebige Operationen ausgeführt werden.
~;
&footer;
# Hier wird nun die subroutine "sub footer" eingebunden.
} else {
&errorroutine;
}
}

######################################################
sub seitevier {


# Parameterdefinition für das zu übergebende Passwort
$pass = param("password");

# Entspricht das Passwort dem Passwort
if ($password eq $pass) {

# Hier wird nun die subroutine "sub header" eingebunden.
&header;
print qq~
Subroutine 4<br>
Hier können dann weitere beliebige Operationen ausgeführt werden.
~;
&footer;
# Hier wird nun die subroutine "sub footer" eingebunden.
} else {
&errorroutine;
}
}

######################################################
sub userdaten {

# Parameterdefinition für das zu übergebende Passwort
# Achtung, hier sind andere Variablen anzuwenden
$pass = param("userp");

# Entspricht das Passwort dem Passwort
# Achtung, hier sind andere Variablen anzuwenden
if ($userp eq $pass) {


print "Content-type: text/html\n\n";
print qq~
<html>
<head><title>Userbereich</title></head>
<body>
Das ist der Userbereich, dieser kann wiederum ganz anders gestaltet sein.<br>
<a href="pass2.pl">Logout</a>
</body>
</html>
~;

} else {
# Fehlermeldung bei ungültigen Daten
print qq~
<html>
<head><title>FEHLER</title></head>
<body>
<div align="center"><b>Fehler: Falscher Username oder Passwort!</b><br><br>
<form action="pass2.pl" method="post">
<input type="hidden" name="action" value="user">

<font face="Verdana, Arial" size="2">Passwort</font>
<input type="password" name="password" size="15"><br><br>

<input type="Submit" value="Einloggen">
</form>
</body>
</html>
~;
}
}

######################################################
# ERRORROUTINE BEI FALSCHEM LOGIN
######################################################
# errorroutine
sub errorroutine {

print "Content-type: text/html\n\n";

print qq~
<html>
<head>
<title>Administrator Login</title>
</head>
<body>
<div align="center">
<font face="Verdana, Arial" size="2" color="red">
<b>Fehler: Falsches Passwort!</b></font><br><br>

<form action="pass2.pl" method="post">
<input type="hidden" name="action" value="login">

<font face="Verdana, Arial" size="2">Passwort</font>
<input type="password" name="password" size="15"><br><br>

<input type="Submit" value="Einloggen">
</form>
</div>
</body>
</html>
~;
exit;
}
######################################################
# HEADER UND FOOTER BEREICH
######################################################
# Header

sub header {

$pass = param("password");

print "Content-type: text/html\n\n";
print qq~
<html>
<head>
<title>Administrationspaneel</title>
</head>

<body>
<div align="center">
<table cellspacing="2" cellpadding="2" border="0" width="600">
<tr>
<td colspan="2">
<table bgcolor="#000080" cellspacing="0" cellpadding="0" border="0" width="100%">
<tr>
<td>
<table  cellspacing="1" cellpadding="2" border=0" width="100%">
<tr>
<td bgcolor="#EFEFEF">
<font face="Verdana, Arial" size="2"><b>Administrationspaneel</b></font></td>
</tr>
</table>
</td></tr></table>
</td>
</tr>
<tr>
<td valign="top" bgcolor="#EFEFEF" width="150">
<!-- Menü hier einfügen -->

<form action="pass2.pl" method="post">
<input type="hidden" name="action" value="seitezwei">
<input type="hidden" name="password" value="$pass">
<input type="Submit" value="Subroutine 2"><br><br>
</form>

<form action="pass2.pl" method="post">
<input type="hidden" name="action" value="seitedrei">
<input type="hidden" name="password" value="$pass">
<input type="Submit" value="Subroutine 3"><br><br>
</form>

<form action="pass2.pl" method="post">
<input type="hidden" name="action" value="seitevier">
<input type="hidden" name="password" value="$pass">
<input type="Submit" value="Subroutine 4"><br><br>
</form>
	
<form action="pass2.pl" method="post">
<input type="hidden" name="action" value="login">
<input type="hidden" name="password" value="$pass">
<input type="Submit" value="Startseite"><br><br>
</form>	

<form action="pass2.pl" method="post">
<input type="Submit" value="Logout">
</form>	


<!-- Menü hier einfügen --></td>
<td valign="top"><!-- HEADERENDE -->
~;
}

######################################################
# Footer

sub footer {

print qq~
<!-- FOOTERANFANG --></td>
</tr>
<tr>
<td colspan="2">
<table bgcolor="#000080" cellspacing="0" cellpadding="0" border="0" width="100%">
<tr>
<td>
<table  cellspacing="1" cellpadding="2" border=0" width="100%">
<tr>
<td bgcolor="#EFEFEF">
<font face="Verdana, Arial" size="2"><b>Administrationspaneel</b></font></td>
</tr>
</table>
</td></tr></table></td></tr></table>
</div>
</body>
</html>
~;
exit;
}
Script Demo: Passwort2.pl

Erläuterungen zum Script:

Also weiter geht's...
elsif ($action ne "login" or "seitezwei" or "seitedrei" or "seitevier"){&errorroutine} Hier habe ich zunächst noch was notiert was bei der übergabe von falschen Parametern die Subroutine errorroutine aufruft. Das "ne" bei elsif steht für » Entspricht nicht « zu gut Deutsch.

Nun weiter mit den Subroutinen und deren Verwendung/Einbindung
Wie jeder sehen wird habe ich hier am Scriptende Subroutinen für Header, Footer und Error angelegt. Eingebunden werden diese Subroutinen nun mit z.B. &header; Es ist also erstmal egal wo die Subroutine sich befindet, genauso hätte ich diese mitten zwischen die anderen Routinen notieren können. Hier soll vielmehr verdeutlicht werden was damit möglich ist. Diese Header, Footer und Errorroutine sind ja hier erstmal nur als Verdeutlichung der Funktionsweise und der Vorteile von Subroutinen gedacht. Subroutinen können ja auch Code enthalten der spezielle Scriptfunktionen z.B. Datum, eine Mailfunktion uvam. beinhaltet. Hier in dem Beispiel ist es das "Scriptdesign" mitsamt Menü. Dieses brauche ich dann halt nicht komplett in jeder Subroutine neu zu schreiben - es wird ganz einfach an der Stelle eingebunden.

Hinweis!
Die Einbindung von Subroutinen kann nicht in einem Bereich erfolgen der mit
print qq~
...
~;
oder ähnlichem eingeschlossen ist.

Subroutinen kann man auch auslagern...
Eine weitere Möglichkeit ist es Subroutinen in externen Dateien zu notieren. Diese externen Subroutinen werden ohne die #!/usr/bin/perl Zeile notiert und mit require "subroutinenname.pl"; in das Script eingebunden. Externe Subroutinen enden mit 1;

Beispiel

# Externe Subroutine zum Zählen von Zeilen
open(DATEI,"$datei");
while(<DATEI>) {
$zeilen = $_;
chomp($zeilen);
$zeilenanzahl = $zeilenanzahl + 1;
}
close(DATEI);
1;
Dies ist natürlich nur ein kleines Beispiel, denkt man aber an ein Forum wird schnell deutlich wie nützlich das sein kann. Ich könnte hiermit z.B. die Userzahl im Forum ausgeben lassen und auch in der Administration.

Genauso einfach ist es Subroutinen ein und aus zu schalten. Hier könnte man das nutzen um in einem Script je nach Useranforderung Mails zu senden oder auch nicht.
if ($emailbenachrichtigung eq "ja") {
require "mail.pl";
}
Diese Subroutinenausgabe die von Bedingingen abhängig gemacht wird ist auch sehr gut zu nutzen um z.B. Menüs bestimmten Usergruppen anzuzeigen oder auch nicht. So kann man wenn ein Passwort zum Administrator passt dessen Menü aufrufen und bei einem Userlogin ein ganz anderes.



 Zum Inhaltsverzeichnis/Workshops Übersichtsseite/Dateien mit Passwortschutz
Autor: Helmut Walter Homepage Inspire-world Fragen, Anregungen und Hinweise bitte in das Forum

Valid HTML 4.0! Valid CSS!