PHP – Kanntest du schon? – SQL Injections

SQL Injections ist ein Thema seit jeher. Die Gefahr ist, dass man über Eingabefelder die SQL-Abfrage so manipulieren kann, um Zugriff auf andere Daten zu erhalten. Das ist einfacher als man denkt. Folgende Beispiel PHP Datei:

Als Beispieldatenbank nehme ich die Datenbank phplogin aus dem Artikel des PHP Login Projekt welche eine Tabelle account erhält. Hier stehen sehr sensible Informationen drin und wir können uns über das simple Query alle Account-Daten aus der Tabelle ausgeben lassen. Wie? Ganz einfach:

Normalerweise würden wir in das Input-Feld nur unsere E-Mail Adresse eintragen, ein Bösewicht (auch Cracker – fälschlicherweise Hacker) genannt könnte aber statt seine E-Mail die obige Zeile eingeben. Eigentlich sollte nur jeder User seine Daten als Ausgabe erhalten, doch folgende Ausgabe erhalten wir:

Wir erhalten alle Daten aus der Tabelle und zwar nicht nur für unseren Benutzer, denn durch die Eingabe hat sich das SQL-Statement von

in folgendes geändert:

Entweder ist die Mail leer, oder 1=1. 1=1 ist eine Bedingung, man könnte sie auch true nennen, die immer zutrifft und damit die Bedingung sofort erfüllt und das Statement ausführt.

Wie verhindert man SQL Injections?

Das Stichwort, bzw. die Stichwörter hier lauten: Prepared Statements. Wie der Name schon erahnen lässt gibt man hier die Daten nicht direkt als gesamtes SQL-Statement an den Datenbank Server. Vielmehr lässt man den Datenbankserver das Statement vorbereitet. Das tun wir, indem wir ihm folgendes SQL-Statement “preparen” lassen:

Er weiß jetzt was er machen soll, nämlich einen SELECT * aus der Tabelle account und als Bedingung wird eine email kommen. Der Server kann Vorbereitungen treffen hat aber noch keine konkreten Daten zum Ausführen dieses Befehls. Erst im zweiten Schritt lässt man den Datenbankserver dieses Statement ausführen und gibt ihm zeitgleich als Parameter die Daten mit, Ausschnitt:

Weil man beim PDO-Connector besser mit Prepared Statements arbeiten kann und dieser im Gegensatz zum MySQLi-Connector Named Parameters unterstützt und auch aus weiteren Gründen, habe ich in diesem Beispiel zur Prävention von SQL-Injection vom MySQLIi-Connector zum PDO-Connector gewechselt.

Der vollständige Code hier:

Geben wir nun unsere E-Mail Adresse ein, erhalten wir nur unsere Daten. Verwenden wir wieder den Teil für die SQL-Injection (siehe unten), erhalten wir eine leere Seite (weiß), weil intern ein Fehler geworfen wird der bei mir zumindest nicht direkt angezeigt wird.

PHP – Kanntest du schon? – Function Array Dereferencing

Seit PHP Version 5.4 wird das sogenannte function array dereferencing unterstützt, was bedeutet es?

In einigen Programmiersprachen, darunter C#, ist es gang und gäbe function array dereferencing zu verwenden, viele wissen nur nicht wie es heißt.

Folgende kleine Funktion liefert uns einfach nur ein Array zum Testen zurück:

Wenn wir nun direkt auf das erste Element zugreifen wollen, können wir dies über function array dereferencing wie folgt tun:

Direkt hinter den Funktionsklammern können wir wie gewohnt über eckige Klammern auf eine beliebige Stelle des Arrays zugreifen.

PHP – Kanntest du schon? – Null Coalescing Operator

Seit PHP Version 7.0 gibt es als “syntactic sugar” wie es immer so schön heißt den null coalescing operator.

Er verkürzt folgende bisher verwendete Schreibweise:

Die neue Schreibweise mit dem null coalescing operator ist folgende:

Man kann die Prüfung auf die Existenz nun sparen.

PHP – Kanntest du schon? – Variadische Funktion/Splat Operator

Varidische Funktionen gibt es in PHP seit Version 4. Bis Version 5.5 konnte man diese aber nur über spezielle Hilfsfunktionen verwenden. Ab Version 5.5 kam der sogenannte Splat Operator dazu.

Das einfachste Beispiel für eine variadische Funktion ist die Formatierung eines Strings. In vielen Programmiersprachen gibt es bereits Funktionen dafür:

  • C: printf(“Mein Name ist %s! Ich bin %d Jahre alt.”, “Matt”, 25);
  • C#: String.Format(“Mein Name ist {0}! Ich bin {1} Jahre alt.”, “Matt”, 25);
  • Java: String.Format(“Mein Name ist %1$s! Ich bin %2$d Jahre alt.”, “Matt”, 25);
  • PHP: sprintf(“Mein Name ist %s! Ich bin %d Jahre alt.”, “Matt”, 25);
  • Genero/4gl: SFMT(“Mein Name ist %1! Ich bin %2 Jahre alt.”, “Matt”, 25);
  • weitere

Ich habe in PHP folgende einfache variadische Funktion geschrieben, die mir einen Text, wie die Funktionen oben formatieren soll, jedoch in C# Schreibweise, wobei ich die Funktion wegen der Länge SFMT nennte.

Der Splat Operator findet sich im zweiten Parameter namens $params wieder. Hier sind drei Punkte () vor den Parameter geschrieben. Dies ist der Splat Operator in PHP.

Ein Aufruf könnte wie folgt aussehen:

Wir können hier ab dem zweiten Parameter ganz normal Kommata getrennt immer mehr Parameter angeben, alle werden über den einen Parameter $params abgerufen.

PHP Login mit Sessions, PDO und Argon2

Immer wieder kommt die Frage auf wie man einen Login realisiert. Das ist auch wichtig, denn nicht jeder soll Zugriff auf alle Daten haben, über den Login haben wir die Möglichkeit dies für einen Benutzer oder ggf. eine Benutzergruppe einzuschränken.

Ein Login ist aber nicht gleich ein Login, denn: Ein Login sollte auch sicher sein. Nur, weil ich einen Benutzernamen oder eine E-Mail und ein Passwort eingebe heißt es nicht, dass es sicher ist. Das Thema hat auch nicht nur mit PHP zu tun, sondern auch mit den Verbindungswegen vom Client (Browser des Benutzers) zum Server (wo die Webanwendung läuft) und die Verschlüsselung der Daten bzw. das Speichern der Passwörter, z.B. in einer Datenbank.

Es gibt viele Tutorials in der großen weiten Welt die auch nach wie vor noch funktionieren, wenn sie auch veraltet sind. Oft wird versucht zu einfach die Dinge zu erklären. Ich versuche einmal einen Login anhand eines möglichst realistischem Beispiels zu erklären, dass bedeutet, dass ich den Sourcecode nur so vereinfache wie man es in echten Umgebungen auch tun würde.

Voraussetzungen

  • Webserver: z.B. nginx, Apache2
  • PHP in der Version 7.2
  • Datenbank MariaDB (MySQL würde auch gehen)
  • (Vor)Erfahrungen
    • Einfache PHP Kenntnisse
    • Einfache Smarty Kenntnisse
    • Einrichtung, Konfiguration bzw. Verwendung eines Webservers (einfachste Möglichkeit über xampp)
    • Anlegen von Datenbanken und Tabellen

Hilfsmittel

  • PhpStorm als IDE/Editor
  • Smarty.net als Template-Engine (Version 3.1.30)

Durchführung

Aller Anfang ist schwer… oder nicht?

Gerade Beginner tun sich schwer und das, meiner Meinung nach völlig unnötig. Wir haben heutzutage gute Editoren besser gesagt integrierte Entwicklungsumgebungen (kurz IDE für Integrated Development Environment) die uns viel Arbeit abnehmen. Was bedeutet das genau? Das bedeutet,

  • dass wir Syntax Highlighting haben und erkannte Fehler sichtbar angezeigt werden können
  • dass wir vor Vertippern geschützt werden, denn eine IDE scannt den Code und weiß wie Variablen und Methoden heißen und gibt uns mögliche Vorschläge über eine Autovervollständigung, gerne auch IntelliSense genannt (geprägt durch die IDE Visual Studio von Microsoft)
  • dass wir nicht nur eine Datei sehen oder viele Tabs haben, sondern auch unsere gesamte Projektstruktur mit Verzeichnis, Unterverzeichnissen und Dateien sehen
  • dass wir in einer weiteren Toolbox alle Methoden und ihre Sichtbarkeiten aufgelistet bekommen inklusive der benötigten Parameter

Die oben genannten Punkte sind nur die gröbsten Punkte die eine IDE abdeckt aber die, wo viele Fehler passieren können bzw. wie sie durch die IDE verhindert werden.

Datenbanktabelle “phplogin”.”account”

Bevor wir das Projekt aufbauen benötigen wir eine Datenbank bzw. in dieser Datenbank auch eine Tabelle. Das Projekt nenne ich phplogin, weswegen auch die Datenbank so heißt. Die Tabelle lautet account. Das SQL zum Erzeugen dieser Tabelle könnte wie folgt aussehen:

Ich verwende in diesem Beispiel keinen Benutzernamen sondern die E-Mail Adresse, was auf vielen Seiten gängige Praxis ist (Amazon, Facebook, etc.).

Vorbereitungen für PHP

Mittlerweile sollte PhpStorm installiert sein. Es kann für 30 Tage getestet oder in diversen Lizenzen gekauft bzw. gemietet werden. Ich werde nicht von Jetbrains bezahlt musste aber feststellen, dass es einfach für mich die beste IDE mit der meisten Funktionalität ist. Alternativ kann auch Eclipse verwendet werden.

Wir verwenden für das Projekt die Template-Engine Smarty. Diese sorgt dafür, dass wir das eigentliche Webdesign (HTML, CSS) von der Logik (PHP, JavaScript, etc). trennen können. Das hat zum einen den Vorteil, dass ein Webdesign Team sich ausschließlich nur mit dem Webdesign beschäftigen muss und sich das Entwicklerteam um die Logik in PHP und zum Beispiel JavaScript kümmern kann zum anderen kann man so aber auch das Design seiner Webseite komplett austauschen ohne etwas an der Logik zu verändern oder Angst haben zu müssen etwas vergessen zu haben. Smarty kann hier heruntergeladen werden: https://www.smarty.net/. Ich verwende für dieses Projekt die Version 3.1.30 (Stand 21.02.2018).

In unserem Webserver-Verzeichnis sollten wir ggf. ein Unterordner für dieses Projekt anlegen, bei mir phplogin genannt. Aus dem Download von Smarty benötigen wir nicht alle Dateien. Lediglich das lib Verzeichnis ist wichtig. Vorerst erstellen wir uns aber ein libs (Achtung plural) in unserem Projekt. Innerhalb dieses libs legen wir einen Ordner smarty an. In diesem Ordner legen wir alle Dateien aus dem lib Verzeichnis aus dem Archiv von Smarty ab. Und, weil das alles so konfus klingt hier nochmal einfach gezeigt:

Das Bild zeigt, dass ich bereits ein Projekt in PhpStorm angelegt habe, hier sollte explizit PHP Version 7.2 gewählt werden, da wir diese auch verwenden.

Konfigurationsdatei

Als nächstes brauchen wir erst einmal eine Konfigurationsdatei für PHP, welche ich config.inc.php nenne. Der Zusatz inc war früher üblich, wenn es sich um eine Datei handelt die man inkludiert. Historisch bedingt aber immer noch gemacht, jedoch nicht zwingend nötig. In dieser Konfigurationsdatei können wir den Projektnamen und die Daten zum Verbindungsaufbau mit der Datenbank anlegen. Die Konfigurationsdatei sieht im gesamten wie folgt aus:

PHPDoc

Nun aber auch Schritt für Schritt erklärt. Es gibt in PHP Kommentare auf zwei Weisen, entweder einzeilige Kommentare mit // oder ein- bzw. mehrzeilige Kommentare mit /* für den Start und */ für das Ende. Die Kommentarblöcke die mit /** anfangen sind spezielle Kommentare für PHPDoc. Dies ist eine Notation (bekannt geworden durch JavaDoc für die Programmiersprache Java), die von vielen integrierten Entwicklungsumgebungen analysiert und verwendet werden kann. Es gibt Kommentarblöcke für Klassen, Methoden, einzelne Variablen und viel mehr. Zusätzlich gibt es zu jedem der speziellen Blöcke auch weitere Parameter/Angaben die mit dem @ Zeichen gekennzeichnet werden. Die Verwendung von PHPDoc sorgt dafür, dass die IDE weiß, welche Methode z.B. welche Parameter (inklusive Datentypen) entgegennimmt und was die Methode zurückgibt. Gegebenenfalls macht die IDE auf Fehler aufmerksam.

Zwingend benötigte Einbindungen/Funktionsaufrufe

In Zeile 9 binden wir die zuvor heruntergeladene Smarty Template-Engine in unser Projekt ein. In Zeile 10 starten wir die Session.

Der Grund warum wir zusätzliche Dateien einbinden sollen, sollte klar sein: Bevor wir eine Funktion aus einem anderen PHP-Skript verwenden können müssen wir unserem jetzigen Skript mitteilen, wo diese Informationen stehen. Wir können so unbegrenzt viele PHP-Skripte einbinden. So können wir Hilfsfunktionen in separate Dateien schreiben und diese an mehreren Stellen einbinden und können diese immer wieder verwendet werden.

Bei der Session hat es denselben Grund: Bevor wir Informationen in eine Session schreiben oder auslesen können, müssen wir eine neue Session erstellen. Dies tun wir mit dem Befehl session_start(). Mehr zu Sessions in einem späteren Teil dieses Artikels.

Da ich PHP Grundkenntnisse voraussetze (wie deklariert, definiert man Variablen) gehe auf Teile wie zum Beispiel Zeile 17-23 nicht weiter ein.

Automatisches (Nach)laden der Klassen

Der Dreizeiler von Zeile 15-17 sorgt dafür, dass in unserem PHP-Skript verwendete Klassen automatisch aus diesem Verzeichnis geladen oder nachgeladen werden, sobald wir diese verwenden. So wird unsere Account-Klasse (so wie auch jede andere die man verwenden könnte) automatisch geladen.

Datenbankverbindung

In Zeile 25-31 legen wir Informationen zur Datenbankverbindung fest und bauen die Verbindung auch auf. Ausschnitt:

Was ist define und wieso speichern wir diese Informationen nicht einfach in Variablen? Define ist eine Konstante die Global im PHP Geltungsbereich liegt und da es eine Konstante ist kann es zur Laufzeit nicht mehr verändert werden. Ideal um wichtige Konfigurationseinträge zu setzen. Wir setzen hier den Server (normalerweise localhost), den Namen der Datenbank in unserem Falle phplogin sowie Benutzername und Passwort. Da das Passwort im xampp für root leer ist, bleibt es auch hier leer.

Zeile 35-42 dienen der Initialisierung der Smarty Template-Engine, worauf ich in diesem Tutorial nicht näher eingehen werde.

PDO (PHP Data Objects)

Kurz ein paar Worte zu PDO. Wenn man mit Datenbankverbindungen arbeiten will hat man in PHP die Möglichkeit sich bei MariaDB bzw. MySQL zwischen dem MySQLi-Connector und PDO zu entscheiden. Zudem gibt es noch alte mysql_* Funktionen die als insecure deklariert wurden und nicht mehr verwendet werden sollten. Wir verwenden hier PDO, warum kann ich euch in folgender Tabelle einfach darstellen:

Beschreibung PDO MySQLi
Database support 12 different drivers MySQL only
API OOP OOP + procedural
Connection Easy Easy
Named parameters Yes No
Object mapping Yes Yes
Prepared statements
(client side)
Yes No
Performance Fast Fast
Stored procedures Yes Yes

Im Großen und Ganzen können beide die nötigsten Funktionen die wir brauchen abdecken, PDO hat aber zum einen den Vorteil, dass es 12 unterschiedliche Datenbanksysteme ansprechen kann, MySQLi nur zwei nämlich MySQL und MariaDB (nur eingeschränkt) zum anderen gibt es aber auch Named Parameters die in Prepare-Statements wichtig sind. Wozu das Ganze sinnvoll ist sehen wir später noch. Wenn wir künftig darauf achten, SQL im ANSI SQL (auch Standard-SQL genannt) zu schreiben können wir so zwischen Datenbanksystem wechseln, indem wir nur den Connection-String in Zeile 33 anpassen.

(Quelle von Tabelle und Bild: https://code.tutsplus.com/tutorials/pdo-vs-mysqli-which-should-you-use–net-24059)

Login und Logout

Kommen wir zum Login und Logout. Dies werden zwei separate PHP-Skripte, genannt login.php und logout.php. Letzteres wird relativ wenig Logik haben, deswegen der Sourcecode mit kurzer Erklärung hier:

Mit require binden wir unsere Konfigurationsdatei ein die wir brauchen, weil sonst die Session nicht über session_start() gestartet wird. Require sagt aber im Gegensatz zu include nicht nur er soll die Datei einbinden, sondern, dass wir diese auf jeden Fall eingebunden haben müssen. session_destroy() versucht die Session zu “zerstören”, also zu löschen. Wenn das klappt, leitet er uns auf unsere spätere Hauptseite um.

Account Klasse

Um auch ein zeitgemäßes Tutorial zu haben, werden wir auch die objektorientierte Programmierung (OOP) kennenlernen. Die Datenbanktabelle Account können wir in PHP als Klasse abbilden. Wir erstellen ein Verzeichnis classes, indem wir eine Account.php erstellen. Diese sieht vorerst wie folgt aus:

Automatisch generierte Getter/Setter in PhpStorm: Wir stellen den Curser hinter das Semikolon von $created und gehen in PhpStorm auf Code → Generate Getters and Setters…
Dann wählen wir jede der Variablen von $id bis $created aus, aktivieren das Häkchen bei Fluent setters und klicken auf OK.

Nachdem ich manuell noch die Datentypen von mixed (automatisch generiert), entsprechend den Datentypen aus der Datenbanktabelle angepasst habe sieht das Ganze so aus:

Abgesehen von unseren Variablen und Gettern sowie Settern, habe ich ein paar Methoden geschrieben, die wir noch benötigen werden. Zwei unterschiedliche Methoden, die Daten zu einem Account aus der Tabelle zu laden, einmal über die E-Mail (für den Login, Select()) und einmal für nach dem Login über die ID, die in der Session gespeichert wird (SelectById()).

Verwenden tun wir diese Methode in der Methode Authenticate($password). Mehr dazu unter Login-Logik.

Login-Logik

Für die Seite login.php müssen wir uns wieder Gedanken machen. Wir wollen später im Template auf das Login-Formular reagieren und werden als Login die E-Mail Adresse und ein Passwort benutzen. Die HTML-Inputs werden wir dann email und password nennen. Da wir das jetzt so festgelegt haben und wissen, können wir direkt die Logik für den Login schreiben. Der Sourcecode sieht wie folgt aus:

Wir prüfen zuerst ob die Felder für E-Mail und Passwort auch befüllt sind (und damit vorhanden). Ist dies der Fall erstellen wir ein Objekt $account vom Typ Account. Wir setzen die E-Mail Adresse über den entsprechenden Setter setEmail und rufen in einer Plausibilitätsprüfung die Methode Authenticate auf des Objekts $account auf. Die Methode macht zwei Dinge:

  1. Sofern die E-Mail gesetzt ist wird die Methode Select() aufgerufen und damit werden alle Daten geladen und befüllt, sofern es diesen Eintrag mit der E-Mail in der Tabelle gibt.
  2. Das mit übergebene Passwort (aus dem Login-Formular) wird über password_verify, eine native PHP-Funktion, die unterschiedliche Hash-Algorithmen überprüfen kann, unter anderem seit PHP 7.2 auch Argon2, verglichen.
  3. Die Methode liefert true zurück wenn das Passwort stimmt, false wenn nicht.

Arbeiten mit Sessions

Sessions sind den Cookies sehr ähnlich. Cookies funktionieren wie Key=Value Werte. Jede Domain kann zu einem Pfad + Domain Werte zu einem Schlüssel setzen. Diese haben eine Laufzeit. Sessions funktionieren recht ähnlich. Eine Session wird mit dem Befehl session_start() erstellt. Passiert das wird diese Session mit einer eindeutigen Session-ID erzeugt, unter PHP nennt sich diese PHPSESSID. Links ist eine Abbildung aus dem Chrome Browser wie der Cookie zu einer Test Session mit Session-ID aussieht.

Früher wurden diese Session-IDs als Parameter mit übergeben. Das ist aber ein Problem, denn mit Hilfe der Session-ID kann man auch eine Session fortsetzen. Somit könnte man die Session einer anderen Person fortsetzen wenn man seine ID kennt. Läuft eine Authentifizierung über die Session, wäre man dann eingeloggt als diese Person. Heutzutage macht man dies aber nicht mehr.

Eine Session wird im Gegensatz zu Cookies aber nicht im Browser sondern auf dem Server gespeichert, was das Ganze recht sicher macht und bedeutet, dass man auch sensiblere Daten speichern kann, die nicht im Browser auslesbar bzw. manipulierbar sein sollen. Die Session kann nur von der entsprechenden Webanwendung auf dem Server manipuliert werden, nicht jedoch vom Client selbst. Sessions werden als Datei ohne Dateiendung abgelegt. Sie beginnen mit sess_ und werden mit der Session-ID fortgesetzt. Bei XAMPP liegen diese Dateien im tmp Verzeichnis.

Für dieses Login-Projekt sieht in diesem einen Fall die Datei nach erfolgreichem Login wie folgt aus:

Der Aufruf (Helper::SetSession($account);) aus der login.php macht nichts anderes, als die Account-ID aus der Datenbanktabelle in der Session zu speichern. Folgende Zeilen Sourcecode in der Datei classes/Helper.php sorgen dafür, dass eben diese ID gesetzt wird.

Wie man sieht greift man in PHP über die superglobale Variable $_SESSION auf alle Session-Variablen zu. Wir setzen hier mit assoziativen Arrays entsprechend die id unter dem account. Alle diese auf die $_SESSION gesetzten Werte können an jeder Stelle genauso abgerufen werden und all diese Werte werden, wie auch die ID in dieser einen Session-ID gespeichert. Rufen wir jetzt eine Seite auf, zum Beispiel einen Bereich den nur eingeloggte Benutzer sehen dürfen, können wir so prüfen ob in der Session ein account bzw. seine id hinterlegt ist und ob dieser auch noch in der Datenbank existiert, denn es wäre ja möglich, dass ein Administrator diesen Account wegen nicht korrekten Verhaltens gelöscht hat.

Damit wir mit unseren Accountdaten auch auf unserer Seite arbeiten können, zum Beispiel um die E-Mail Adresse anzuzeigen, können wir die gesamte Account-Klasse an die Template-Engine übergeben. Auch dafür gibt es eine Hilfsmethode in der Helper.php:

In Zeile 56 bis 62 haben wir in der config.inc.php bereits eine Logik dafür programmiert, hier nochmal der Ausschnitt:

Hier werden zwei Variablen an Smarty übergeben.

  • ISAUTH: Mit einem booleschen Wert ob man eingeloggt ist oder nicht
  • SESSION: Mit allen Session-Informationen aus der superglobalen Variable $_SESSION

In den Templates können wir in Smarty-Schreibweise auf Variablen wie folgt zugreifen, z.B. in einer Plausibilitätsprüfung {if $ISAUTH} … {/if}. Wollen wir etwas Ausgeben gibt es in unserem Beispiel eine Besonderheit. Die Variablen innerhalb der Klasse sind auf protected gesetzt. Das bedeutet nur innerhalb der Klasse oder bei Vererbung Kindklassen können direkt auf diese zugreifen. Von außerhalb müssen wir über die Getter zugreifen, bedeutet für die Ausgabe der E-Mail Adresse in Smarty ist folgende Zeile falsch:

Folgende Zeile wäre korrekt:

Wie komme ich an mein Passwort?

Ich habe dem Projekt eine Datei argon2.php hinzugefügt. Ruft man sie mit dem Parameter ?p auf kann man dort sein Passwort übergeben, z.B.:

http://127.0.0.1/phplogin/argon2.php?p=meinPasswortAlsArgon2Hash

Bitte nicht wundern, denn bei jedem Aufruf mit demselben Passwort wird aus diesem Passwort immer wieder ein neuer Hash gebildet.

Ist der Login sicher?

Man kann es den Angreifern nur so schwer wie möglich machen, einen 100% Schutz gibt es nie. Wichtig ist, dass wir hier ein HTML-Formular haben mit Input-Feldern. Wir senden dem Server unsere E-Mail-Adresse und unser Passwort. Standardmäßig ist dies unverschlüsselt. Zudem darf man Anfragen nur als POST senden.

  • Können wir diese Verbindung absichern? Ja.
  • Geht das kostenlos? Ja.
  • Ist es einfach? Das kommt darauf an.

Das Zauberwort nennt sich SSL und https. Sichere Verbindungen erkennt man im Browser, wie es im Chrome aussieht erkennt man am Bild rechts. Ein https heißt nicht gleich, dass die Verbindung sicher ist. Wichtig ist, dass der Server über ein entsprechend signiertes Zertifikat verfügt. Wer sich mit dem Thema weiter auseinandersetzen möchte und kostenlos ein Zertifkat erhalten möchte, muss sich mit dem Thema Let’s Encrypt auseinandersetzen. Viele Provider von Webhosting-Angeboten haben bereits 1-Click-Assistenten für die Beschaffung und Installation eines solchen Zertifikats integriert. Der Anbiete bei dem meine Seiten betrieben werden ist einer von ihnen.

Weiteres

An diversen Stellen findet hier Smarty die Erwähnung doch es folgt kein HTML-Code. Das hat einen Grund: Der Artikel ist so schon lang, darauf noch einzugehen (zumal die Thematik nicht HTML und Smarty ist) wäre too much. Das Projekt mit allen Dateien inklusive einer SQL-Datei für die Datenbank gibt es aber hier zum Download:

Download “phplogin” phplogin_v0.2.zip – 43-mal heruntergeladen – 287 KB


11.03.2018: Ein Fehler im Artikel wurde korrigiert. Konkret Zeile 41 der config.inc.php. Im Projekt war diese aber bereits korrigiert. Ein erneuter Download ist nicht nötig!

23.02.2018: Der Artikel wurde korrigiert, dass ZIP wurde ebenfalls korrigiert. Es gab einige Unterschiede in den Gettern/Settern und deren Aufrufe. Groß- und Kleinschreibung sind das Stichwort und extrem wichtig!