Es ist nützlich, ein neues Verzeichnis innerhalb des Dateibaumes unseres Webservers anzulegen, in welchem die Applikation entwickelt werden wird. In diesem Verzeichnis wird der Front-Controller in der Datei index.php
hinterlegt. Der Front-Controller soll zunächst sicherstellen, dass sich der Benutzer authentifizieren muss, um mit der Adressdatenbank arbeiten zu können. Die Benutzernamen/Passwort-Kombinationen stehen dabei in der Datenbank. Die Passwörter sind gemäß des PHP-Passwort-Hashings, welches in dem Abschnitt Passwort-Hashing vorgestellt wurde, gehasht:
Zunächst wird mit mit dem Tool phpMyAdmin eine neue Datenbank für das Projekt mit dem Namen cruddb
angelegt. In dieser Datenbank wird eine neue Tabelle mit dem Namen users
erzeugt:
1 2 3 |
CREATE TABLE `users` (`username` VARCHAR(60) NOT NULL , `userpassword` VARCHAR(255) NOT NULL , PRIMARY KEY (`username`)); |
Mit Hilfe des folgenden Statements kann nun ein neuer Nutzer zu dem System hinzugefügt werden:
1 2 |
INSERT INTO `users` (`username`, `userpassword`) VALUES ('admin', 'gehashtes Passwort'); |
Für den Wert gehashtes Passwort
muss ein gehashtes Passwort hinterlegt werden. Dies geschieht mit der Funktion password_hash()
aus dem Abschnitt Passwort-Hashing.
Die Prüfung der Benutzernamen/Passwortkombination in der index.php
sieht nun wie folgt aus:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
require_once('config.php'); $loginSuccessfull = false; if (isset($_SERVER['PHP_AUTH_USER'])) { // Datenbank fragen $pdo = new PDO("mysql:host=$dbhost;dbname=$dbname", $dbuser, $dbpasswd); $statement = $pdo->prepare("SELECT userpassword FROM users WHERE username= ?"); if($statement->execute (array($_SERVER['PHP_AUTH_USER']))){ if ($statement->rowCount() == 1) { $row = $statement->fetch(); $pw = $row[0]; $loginSuccessfull = password_verify($_SERVER['PHP_AUTH_PW'], $pw); } } else { echo ("SQL Fehler"); } $statement->closeCursor(); } // Login sicherstellen if ($loginSuccessfull){ // Hier wird der nächste Teil des // Front-Controllers eingefügt } else { // Kein Login vorhanden => Login anfordern header('WWW-Authenticate: Basic realm="Addressbuch"'); header('HTTP/1.0 401 Unauthorized'); echo('Ein gültiger Login wird benötigt. Bitte wenden Sie sich an den Administrator.'); } |
Innerhalb der benötigten config.php
befinden sich die nötigen Datenbankparameter. Diese werden ausgelagert, so dass das Programm nur durch ein Editieren dieser Datei an eine neue Umgebung angepasst werden kann:
1 2 3 4 5 6 |
<?php $dbhost = 'localhost'; $dbuser = 'benutzer'; $dbpasswd = 'seinpasswort'; $dbname = 'cruddb'; ?> |
Schon an dieser Stelle ist eine zweite Datei für das zu entwickelnde Programm mit hinzugekommen. Es muss sichergestellt werden, dass diese Datei nicht eigenständig aufgerufen wird, so dass sich keine eventuellen Sicherheitslücken auftun. Alle Anfragen müssen über den Front-Controller geleitet werden. Dies kann sichergestellt werden, indem der Webserver angewiesen wird, die config.php
nicht separat auszuliefern. Einfacher ist es jedoch, vor jeder PHP-Datei, die nicht aufgerufen werden kann, einen Guard zu schalten. Dafür wird ganz zu Beginn der index.php
folgende Zeile eingefügt:
1 2 3 |
<?php $frontcontrollerVisited = true; // ... weiteres Skript |
Und jede Datei, die nicht separat aufgerufen werden darf, erhält als erste Zeile folgende Anweisung:
1 2 3 |
<?php if (!isset($frontcontrollerVisited) || $frontcontrollerVisited == false) die(); // ... weiteres Skript |