Ein webbasiertes Passwort-Depot mit phpmyedit erstellen
Autor: Christian Asche
Worum geht es? phpmyedit am praktischen Beispiel!
In diesem Tutorial wollen wir ein Programm entwickeln, das zur Verwaltung von Kennwörtern dient. Die Kennwörter werden mit einem Verschlüsselungsverfahren in einer mySQL Datenbank gespeichert. Über ein Kennwort hat man Zugriff auf die gespeicherten Kennwörter. Um uns die Tabellenverwaltung zu erleichtern, verwenden wir die Klasse phpmyedit.
phpmyedit ist eine PHP Klasse, die uns auf einfache Weise eine HTML Benutzeroberfläche zur mySQL Tabellenverwaltung generiert. Die wichtigsten Merkmale von phpmyedit sind:
- Code-Generierung zur Tabellenmanipulation
- Einträge hinzufügen, ändern, kopieren, anzeigen und löschen
- Blättern, Sortieren und Filtern der Tabelle
- Abbilden von 1:N Beziehungen zwischen Tabellen
- Rechteverwaltung
- Flexibles CSS Konzept
- Logging der Benutzeraktionen
- Mehrsprachig
- Möglichkeit, die Basisklasse zu erweitern
phpmyedit unterliegt der GPL. Für kommerzielle Projekte kann man eine Lizenz kaufen, die phpmyedit von der ansteckenden GPL befreit. Es vereinfacht nicht nur den Verkauf von Programmen die auf phpmyedit basieren, man unterstützt damit auch die Weiterentwicklung des Projektes.
Mir geht es weniger darum ein ausgefeiltes Programm zu erstellen, als eine praxisnahe und einfache Einweisung in phpmyedit zu vermitteln.
Wo wollen wir hin?
Ein fertiges Beispiel kann man sich hier runterladen. Die Installation ist sehr einfach.
- In der Datei head.inc.php die mySQL Zugangsdaten eintragen
- Eine Datenbank anlegen
- Die Datei struktur.sql (enthält nur die Tabellendefinition) oder beispieldaten.sql (enthält Tabellendefinitionen und Beispieldaten) in die Datenbank einspielen.
- Das Kennwort mit dem die Inhalte verschlüsselt worden sind lautet foo.
Vorraussetzungen
Los geht’s – Die Datenbank
Wir erstellen eine neue mySQL Datenbank. Dazu führen wir diesen SQL Query z.B. in phpmyadmin oder dem Kommandozeilentool mysql aus:
CREATE DATABASE `passwort_depot` ;
Nun erzeugen wir die Tabellen:
CREATE TABLE `kennwoerter` ( `id` INT NOT NULL AUTO_INCREMENT , `bezeichnung` BLOB NOT NULL , `kennwort` BLOB NOT NULL , `kategorie_id` INT NOT NULL , PRIMARY KEY ( `id` ) ) TYPE = innodb CHARACTER SET latin1 COLLATE latin1_german1_ci; CREATE TABLE `kategorien` ( `id` INT NOT NULL AUTO_INCREMENT , `kategorie_bezeichnung` VARCHAR( 255 ) NOT NULL , PRIMARY KEY ( `id` ) ) TYPE = innodb CHARACTER SET latin1 COLLATE latin1_german1_ci;
Die Tabelle kennwoerter enthält die verschlüsselten Kennwörter und ist über einen Fremdschlüssel kategorie_id mit der Tabelle kategorien verbunden.
Die Benutzeroberfläche
Wir erstellen nun mit phpmyedit den größten Teil unserer Benutzeroberfläche. Alle Dateien und Verzeichnisse die wir jetzt benötigen sind in der phpmyedit Distribution enthalten. In einem Verzeichnis auf unserem Webserver sollten sich folgende Dateien und Verzeichnisse befinden:
- images/
- lang/
- phpMyEdit.class.php
- phpMyEditSetup.php
Im Folgenden gehe ich davon aus, das diese Dateien im root Verzeichnis unseres Webservers liegen und über http://localhost/phpMyEditSetup.php aufgerufen werden können.
Wir rufen die Adresse http://localhost/phpMyEditSetup.php auf. In dem Formular geben wir die Zugangsdaten für unsere mySQL Datenbank ein und klicken auf submit.

Nun sollten wir mindestens unsere neue Datenbank sehen. Diese wählen wir und klicken auf submit.

Wir starten zuerst mit der Tabelle kategorien. Auswählen und auf submit klicken.

In diesem Schritt wählen wir den Primärschlüssel der Tabelle. In unserem Fall heißt die Spalte id.

Im letzten Schritt können wir verschiedene Einstellungen für die generierte Datei wählen. Die Bezeichnungen sind selbsterklärend.

Nun sollte phpmyedit die Datei kategorien.php erzeugt haben. Falls es hierbei zu einer Fehlermeldung kam, besitzt PHP wahrscheinlich keine Schreibrechte auf das Verzeichnis.

Genauso verfahren wir mit der Tabelle kennwoerter.
Wir testen das Ergebnis nun, indem wir die zwei Dateien aufrufen: http://localhost/kategorien.php, http://localhost/kennwoerter.php
Wir können nun neue Einträge in den Tabellen erstellen, Einträge ändern, Einträge löschen und uns eine Tabellenansicht zeigen lassen, die sortier- und filterbar ist.
Zum Test legen wir folgende Kategorien an: E-Mail Accounts, PC Accounts, Foren Kosmetik
Lade Dir die Dateien head.inc.php und main.css runter und kopiere sie in das Verzeichnis. Ersetze nun diesen Anfang der Dateien kategorien.php und kennwoerter.php …
<style type="text/css">
table { border: #004d9c 1px solid; border-collapse: collapse; border-spacing: 0px; width: 100%; }
th { border: #004d9c 1px solid; padding: 4px; background: #add8e6; }
td { border: #004d9c 1px solid; padding: 3px; }
hr { border: 0px solid; padding: 0px; margin: 0px; border-top-width: 1px; height: 1px; }
</style><?php
… durch …
<?php
include("head.inc.php");
Nun fehlen nur noch der die schließenden body und html Tags in jeder Datei. Die zwei Dateien sollten mit ?></body></html> enden.
Anmeldung
Die Inhalte werden auf Basis eines Kennwortes ver- und entschlüsselt. Dieses Kennwort speichern wir dauerhaft in einer Session Variable $_SESSION[‚pme_pass’]. So ist es auf jeder Seite verfügbar bis wir den browser schließen oder uns abmelden.
Zuerst benötigen wir ein Formular.
if(isset($_SESSION['pme_pass']) && $_SESSION['pme_pass']!=''){
echo '
Ein Kennwort wurde gesetzt.
<input type="hidden" name="unsetPasswd" value="1" />
<input type="submit" value="Verschlüsseln" />
';
}else{
echo '
<label for="passwd">Kennwort</label>
<input type="password" name="passwd" id="passwd" />
<input type="submit" value="Entschlüsseln!" />
';
}
Das Formular wird nur angezeigt, wenn die Session Variable nicht vorhanden ist. Damit die Session überhaupt gestartet wird, müssen wir sie starten, bevor irgendetwas an den browser gesendet wurde. Dies tun wir in der Datei head.inc.php mit folgendem Code:
<?php session_start(); ?>
Die Kennwortverwaltung
Kommen wir nun zur eigentlichen Kennwortverwaltung in der Datei kennwoerter.php. Diese Datei enthält ein array $opts, mit dem phpedit gesteuert wird. Interessant ist für uns das Element fdd (ab Zeile 108), in dem die Anweisungen für die Formularelemente und Tabellen definiert sind.
Wir starten mit dem Fremdschlüssel kategorien_id. Das Formularelement soll als Werte nur Inhalte der Tabelle kategorien zulassen. Wie der Name schon sagt, verweist kategorien_id auf die Spalte id der Tabelle kategorien. Wir erweitern das array im Element $opts['fdd']['kategorie_id'] (Zeile 136) um ein Element values:
$opts['fdd']['kategorie_id'] = array( 'name' => 'Kategorie ID', 'select' => 'T', 'maxlen' => 11, 'default' => '0', 'required' => true, 'sort' => true, 'values' => array( 'table' => 'kategorien', 'column' => 'id' ) );
In der Formularansicht „Hinzufügen“ sehen wir nun die Inhalte der Spalte id aus der Tabelle kategorien.

Diese Werte wollen wir speichern. Zur Anzeige eignen sich aber die Inhalte der Spalte bezeichnung besser. Wir erweitern unser array:
$opts['fdd']['kategorie_id'] = array( 'name' => 'Kategorie ID', 'select' => 'T', 'maxlen' => 11, 'default' => '0', 'required' => true, 'sort' => true, 'values' => array( 'table' => 'kategorien', 'column' => 'id', 'description' => 'kategorie_bezeichnung' ) );

phpmyedit verfügt über eine recht flexible Möglichkeit um hier Kombinationen aus verschiedenen Feldern anzeigen zu lassen. Näheres findet sich im Handbuch unter Kapitel 4.4. Input restrictions.
Die Verschlüsselung in der Theorie
Hierbei machen wir uns mySQL eigene Funktionen zu nutzen.
ENCODE( inhalt, kennwort ) DECODE( spalte, kennwort )
Die Funktion ENCODE verschlüsselt den String inhalt mit Hilfe des strings kennwort. Die Funktion DECODE entschlüsselt den Inhalt der Spalte spalte mit Hilfe des strings kennwort. Ein einfacher Schutz um ein Kennwort nicht im Klartext speichern zu müssen. Ohne unser geheimes Kennwort kommt man nur mit Zeitintensiven Mitteln an den Inhalt.
Die sichereren Methoden zur Einwegverschlüsselung, wie z.B. md5 oder crypt, sind für unser Passwort Depot nicht zu gebrauchen, da man den Inhalt nicht mehr rekonstruieren kann.
Die Verschlüsselung in der Praxis
Wir halten phpmyedit an, beim Lesen der Daten den Inhalt mit unserem Kennwort aus der Session zu decodieren. Beim Schreiben wird der Inhalt des Formularfeldes mit dem Kennwort aus der Session encodiert. Dazu erweitern wir die arrays der Felder bezeichnung und kennwort mit den Elementen sql (Lesen) und sqlw (Schreiben):
$opts['fdd']['bezeichnung'] = array( 'name' => 'Bezeichnung', 'select' => 'T', 'maxlen' => 65535, 'textarea' => array( 'rows' => 5, 'cols' => 50), 'required' => true, 'sort' => true, 'sql' => 'DECODE(bezeichnung, "'.$_SESSION['pme_pass'].'")', 'sqlw' => 'ENCODE($val_qas, "'.$_SESSION['pme_pass'].'")' ); $opts['fdd']['kennwort'] = array( 'name' => 'Kennwort', 'select' => 'T', 'maxlen' => 65535, 'textarea' => array( 'rows' => 5, 'cols' => 50), 'required' => true, 'sort' => true, 'sql' => 'DECODE(kennwort, "'.$_SESSION['pme_pass'].'")', 'sqlw' => 'ENCODE($val_qas, "'.$_SESSION['pme_pass'].'")' );
Einfügen neuer Datensätze nur mit Kennwort erlauben
Bisher kann man noch wild neue Inhalte einfügen und ändern, ohne dass man sich anmelden muss. Das wollen wir ändern. Hierbei hilft uns das Element options (Zeile 37).
// A - add, C - change, P - copy, V - view, D - delete, // F - filter, I - initial sort suppressed $opts['options'] = 'ACPVDF';
Über dieses Element können wir die Zugriffsrechte steuern. Wir löschen dieses Element aus den zwei Dateien und packen es zur besseren Übersicht in die Datei head.inc.php.
if(isset($_SESSION['pme_pass']) && $_SESSION['pme_pass']!=''){
echo '
Ein Kennwort wurde gesetzt.
<input type="hidden" name="unsetPasswd" value="1" />
<input type="submit" value="Löschen" />
';
// Options you wish to give the users
// A - add, C - change, P - copy, V - view, D - delete,
// F - filter, I - initial sort suppressed
$opts['options'] = 'ACPVDF';
}else{
echo '
<label for="passwd">Kennwort</label>
<input type="password" name="passwd" id="passwd" />
<input type="submit" value="Entschlüsseln!" />
';
// Options you wish to give the users
// A - add, C - change, P - copy, V - view, D - delete,
// F - filter, I - initial sort suppressed
$opts['options'] = 'FV';
}
Nur wenn das Kennwort in der Session gesetzt ist, erhält der Benutzer das Rechte neue Datensätze hinzuzufügen, vorhandene zu ändern, usw.
Fazit
Natürlich ist dies kein sehr sicheres Passwort-Depot und es fehlen verschiedene Dinge, wie z.B. noch ein globaler Zugriffsschutz. Die Fähigkeiten von phpmyedit kommen in diesem kurzen Tutorial auch nicht wirklich zur Geltung. Zu viele Möglichkeiten bietet diese Klasse, als das man sie in so einem kleinen Umfang abhalten könnte. Dennoch haben wir einen einfachen Einblick in dieses Projekt bekommen und phpmyedit hat gezeigt, dass es uns viel Arbeit sparen kann.
Wichtiger Hinweis: Der Inhalt dieser Seite wird unter den Bedingungen der GPL veröffentlicht. Der Autor übernimmt keine Garantie für die Richtigkeit der Inhalt, sowie für die Programme die über diese Seite heruntergeladen werden können. Benutzung auf eigene Gefahr.
