Übungsaufgaben
Nachfolgend drei kleine Übungsaufgaben, um das zuvor gelernte etwas zu vertiefen. Zuerst bauen wir eine kleine, passwortgeschützte Seite. Danach ein Beispiel, wie man überprüfen kann ob Formularfelder vom Benutzer ausgefüllt wurden. Zum Schluss wie man scheinbar mehrere Websites mit nur einer PHP Datei ausgeben kann.
Inhaltsverzeichnis
Übung 1: Passwortschutz
Für unseren Passwortschutz brauchen wir zuerst ein Eingabeformular für einen Benutzernamen und für ein Passwort. Dies sieht in etwa so aus, welches wir in seite1.php abspeichern können.
1 2 3 4 5 6 7 8 9 |
<form action="seite2.php" method="post"> Benutzername:<br /> <input type="Text" name="username"><br /><br /> Passwort:<br /> <input type="Password" name="passwort" /> <input type="Submit" value="Absenden" /> </form> |
Passwortabfragen sollten immer mit post übermittelt werden, denn wenn es mit get übermitteln wurde, würde jeder später im Verlauf sehen können, welches Passwort man benutzt.
Jetzt kommen wir zum PHP Teil, welches wir in seite2.php abspeichern:
1 2 3 4 5 6 |
<?php $username = $_POST["username"]; $passwort = $_POST["passwort"]; $pass = sha1($passwort); ?> |
Als erstes fragen wir die übertragenden Daten ganz einfach wieder ab.
Mit sha1 berechnen wir den Hashwert vom Passwort. Die Rückumwandlung vom SHA-1-Hashwert zum Passwort ist schwierig und nur mit großen Recheneinsatz möglich. Bei sicheren Passwörtern ist das Zurückrechnen praktisch unmöglich. Dies gewährt gewissen Schutz, hat ein Angreifer beispielsweise zugriff auf die Datei mit dem SHA-1-Hashwert, dann kann er daraus nicht ohne größeren Aufwand die Klartextpasswörter ableiten.
Ein Wort, z.B. das Wort php-einfach, das mit sha1 gehasht wurde, sieht dann ca. so aus:
18a568863914f5ec56599b1ac22a93cbd7b8ce00
Damit wir jetzt eine if-Anweisung machen können, müssen wir zuerst das Passwort in einen sha1-String (Text) umwandeln.
Dafür können wir den sha1-Generator benutzen, oder wir machen einen eigenen Generator.
Unseren Code müssen wir dann so abwandeln.
1 2 3 4 5 6 7 8 |
<?php $username = $_POST["username"]; $passwort = $_POST["passwort"]; $pass = sha1($passwort); echo $pass; ?> |
Drücken wir auf Absenden bei dem Formular, erhalten wir das eingegebene Wort als sha1-String wieder ausgegeben. Diesen Hashwert für unser Passwort kopieren wir später in die passwortgeschützte Seite.
Achtung: Die sha1-Funktion unterscheidet zwischen Groß- und Kleinschreibung.
beispiel sieht umgewandelt so aus:
89cfb96efc4c673ec04899ca63f5ae9b83af43d1
Beispiel sieht umgewandelt so aus:
540294507309acc5c7a6fd79ea644f094d651d33
Jetzt kommt die if-Anweisung. Damit überprüfen wir, ob das verschlüsselte Passwort das gleiche ist, das wir gespeichert haben.
Unser Code für seite2.php sieht wie folgt aus:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?php $username = $_POST["username"]; $passwort = $_POST["passwort"]; $pass = sha1($passwort); if($username == "Nils" AND $pass=="89cfb96efc4c673ec04899ca63f5ae9b83af43d1") { echo "Herzlich Willkommen"; } else { echo "Login Fehlgeschlagen"; } ?> |
In der if-Anweisung schreiben wir jetzt unseren sha1-String hinein.
Drückt man bei dem Formular auf Absenden, so werden diese Daten an seite2.php gesendet. seite2.php fragt diese Eingaben ab und verschlüsselt das Textfeld passwort in einen sha1-String. Die if-Anweisung fragt dann ab, ob das eingegebene, verschlüsselte Passwort das gleiche ist, das in der if-Anweisung steht.
Was habe ich von der sha1-Funktion?
Das hashen von Passwörtern, also das Umwandeln der Passwörter in ihren sha1-Hashwert, und nur diese Hashwerte abzuspeichern erhöht die Sicherheit des System. Angenommen ein Angreifer erhält unberechtigten Zugriff auf euer System. Sind die Passwörter nur im Klartext hinterlegt, dann kann der Angreifer erheblichen weiteren Schaden anrichten. Sind sie allerdings als Hashwert hinterlegt, ist der potentielle Schaden deutlich geringer. Sofern eure Benutzer ein sicheres Passwort gewählt haben (d.h. mehr als 8 Zeichen, idealerweise Buchstaben und Zahlen verwendet), dann kann der Angreifer die Passwörter nicht zurück berechnen und somit auch keinen weiteren Schaden anrichten. Deswegen sollten Passwörter stets nur als Hashwert gespeichert werden.
Neben der SHA-1-Hashfunktion implementiert PHP noch einige weitere Hashfunktionen, beispielsweise md5.
Übung 2: Überprüfung ob alle Felder ausgefüllt wurden
Häufig möchte man sicherstellen, dass alle Felder eines Formulars ausgefüllt wurden. Beispielsweise wenn ihr eine Registrierungsfunktion implementiert muss man sichergehen, dass alle Pflichtfelder ausgefüllt wurden.
Dafür starten wir erneut mit einem Formular:
1 2 3 4 5 6 7 8 9 10 |
<form action="seite2.php" method="post"> E-Mail:<br> <input type="Text" name="email"><br><br> Kommentar:<br> <textarea name="kommentar" cols="30" rows="5"> </textarea> <input type="Submit" value="Absenden"> </form> |
In diesem Formular gibt man seine E-Mail Adresse an und ein Kommentar.
Diese Daten werden an seite2.php geschickt:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?php $email = $_POST["email"]; $kommentar = $_POST["kommentar"]; if($email == "" OR $kommentar == "") { echo "Bitte füllen Sie alle Felder aus"; } else { echo "Ihr Eintrag wurde gespeichert"; } ?> |
Wie immer fragen wir zuerst die übermittelten Daten ab. Mit der if-Anweisung überprüfen wir, ob beide Felder ausgefüllt wurden, dazu brauchen wir OR.
Neben OR könnt ihr auch den logischen Operator AND verwenden. Jetzt überprüfen wir, dass beide Felder ungleich dem leeren String sind:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?php $email = $_POST["email"]; $kommentar = $_POST["kommentar"]; if($email != "" AND $kommentar != "") { echo "Ihr Eintrag wurde gespeichert"; } else { echo "Bitte füllen Sie alle Felder aus"; } ?> |
Wenn ein oder beide Felder leer sind, erhält der Besucher eine Fehlermeldung. Wenn er sie aber ausgefüllt hat, werden seine Eingaben gespeichert. Wie das speichern funktioniert erfahrt ihr später.
Solch eine if-Anweisung braucht man ziemlich oft, z.B. bei Gästebüchern wird eine solche if-Anweisung fast immer eingebaut.
Übung 3: Mehrere HTML-Dokumente in einer PHP-Datei
Ein großer Vorteil von PHP ist es, dass man dynamische Inhalte anzeigen lassen kann. Programmiert ihr eine Seite, wie z.B. ein Online-Shop oder ein Forensystem, so existieren dutzend vielleicht sogar viele tausende Seiten. Natürlich möchte man nicht für jeden Artikel im Shop oder für jeden Beitrag im Forum eine neue HTML Seite anlegen. Stattdessen werden die Seiten dynamisch erzeugt und dem Benutzer angezeigt.
Damit wir im Script wissen, welche Seite wir anzeigen möchte, können wir Variablen mittels GET übergeben und abhängig vom Wert verschiedene Ausgaben produzieren.
Beispielsweise starten wir unsere PHP-Datei wie folgt:
1 2 3 |
<?php $seite = $_GET["seite"]; ?> |
Damit haben wir jetzt als Eingabefeldnamen seite benutzt. Dieser Wert ist in der Variable $seite gespeichert. Natürlich könnt ihr auch andere Namen benutzen.
Wie wir bereits gelernt haben, werden Daten, die mit GET übermittelt werden, an die URL angehängt. Also brauchen wir kein Formular, um bestimmte Eingaben zu senden, sondern hängen wir diese einfach an die URL dran und drücken dann Enter.
Danach brauchen wir eine if-Anweisung die prüft was eingegeben wurde.
Diese kann so aussehen:
1 2 3 4 5 6 7 |
<?php $seite = $_GET["seite"]; if($seite == "index") { echo "Herzlich Willkommen auf der Indexseite"; } ?> |
Rufen wir dann im Browser diese Datei auf, erhalten wir zuerst eine leere Seite. Hängen wir aber jetzt an die URL ?seite=index dran, erhalten wir die Ausgabe, die zwischen unserer if-Anweisung steht.
Somit können wir jetzt beliebig viele Unterseiten einfügen.
Das sieht dann ca. so aus:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?php $seite = $_GET["seite"]; if($seite == "index") { echo "Indexseite"; } if($seite == "start") { echo "Startseite"; } ?> |
Rufen wir jetzt unsere URL mit dem Anhang ?seite=index auf, erhalten wir als Ausgabe nur Indexseite, rufen wir allerdings diese Seite mit dem Anhang ?seite=start auf, erhalten wir als Ausgabe nur Startseite.
Somit können wir viele Unterseiten in einer PHP-Datei speichern.
Wenn man möchte, das der Browser eine bestimmte Seite aufruft, wenn man nichts an die URL drangehängt, brauchen wir empty. Damit können wir überprüfen, ob eine Variable (z.B. $seite) leer ist.
Der Script sieht dann so aus:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<?php $seite = $_GET["seite"]; if(empty($seite)) { $seite="index"; } if($seite == "index") { echo "Indexseite"; } if($seite == "start") { echo "Startseite"; } ?> |
Wenn wir die Datei ohne Anhang aufrufen, erhalten wir die Ausgabe von ?seite=index.
Links könnten dann so aussehen:
1 2 |
<a href="seite1.php?seite=index">Indexseite</a> <a href="seite1.php?seite=start">Startseite</a> |
Natürlich könnten die Links auch in einer der if-Anweisungen stehen, ca. so:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<?php $seite = $_GET["seite"]; if(empty($seite)) { $seite="index"; } if($seite=="index") { echo "Indexseite"; echo "<a href=\"?seite=start\">Zur Startseite</a>"; } if($seite=="start") { echo "Startseite"; echo "<a href=\"?seite=index\">Zur Indexseite</a>"; } ?> |
Formulare können wir auch innerhalb einer Datei verschicken, dafür müssen wir nur bei action den richtigen Anhang eintragen.
Ungefähr so:
1 |
<form action="?seite=start" method="post"> |
Wenn das Formular innerhalb eines Dokumentes verschickt werden soll, reicht der Anhang, wenn wir das aber an eine andere Seite schicken möchten, dann müssen wir auch den Dateinamen angeben.
Wozu braucht man dies?
Klar könnten wir alles in verschiedenen Dateien speichern, aber hat man z.B. bei einer Registration mehrere Schritte (z.B. 10), dann müsste man 10 Dateien anlegen, mit diesem Prinzip aber nur 1 Datei.