Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. PHP

Sichern Sie Ihre Formulare mit Formularschlüsseln

by
Difficulty:IntermediateLength:LongLanguages:

German (Deutsch) translation by Alex Grigorovich (you can also view the original English article)

Sicherheit ist ein heißes Thema. Die Gewährleistung der Sicherheit Ihrer Websites ist für jede Webanwendung äußerst wichtig. Tatsächlich verbringe ich 70% meiner Zeit damit, meine Anwendungen zu sichern. Eines der wichtigsten Dinge, die wir sichern müssen, sind Formulare. Heute werden wir eine Methode überprüfen, um XSS (Cross-Site Scripting) und Cross-Site Request Forgery auf Formularen zu verhindern.

Warum?

POST-Daten können von einer Website zur anderen gesendet werden. Warum ist das so schlimm? Ein einfaches Szenario...

Ein Benutzer, der auf Ihrer Website angemeldet ist, besucht während seiner Sitzung eine andere Website. Diese Website kann POST-Daten an Ihre Website senden - beispielsweise mit AJAX. Da der Benutzer auf Ihrer Website angemeldet ist, kann die andere Website auch Postdaten an gesicherte Formulare senden, auf die erst nach einer Anmeldung zugegriffen werden kann.

Wir müssen unsere Seiten auch vor Angriffen mit cURL schützen

Wie beheben wir das?

Mit Formularschlüsseln! Wir fügen jedem Formular einen speziellen Hash (einen Formularschlüssel) hinzu, um sicherzustellen, dass die Daten nur verarbeitet werden, wenn sie von Ihrer Website gesendet wurden. Nach dem Senden eines Formulars überprüft unser PHP-Skript den gesendeten Formularschlüssel anhand des Formularschlüssels, den wir in einer Sitzung festgelegt haben.

Was wir tun müssen:

  1. Fügen Sie jedem Formular einen Formularschlüssel hinzu.
  2. Speichern Sie den Formularschlüssel in einer Sitzung.
  3. Überprüfen Sie den Formularschlüssel nach dem Senden eines Formulars.

Schritt 1: Ein einfaches Formular

Login Form

Zuerst benötigen wir ein einfaches Formular zu Demonstrationszwecken. Eines der wichtigsten Formulare, die wir sichern müssen, ist das Anmeldeformular. Das Anmeldeformular ist anfällig für Brute-Force-Angriffe. Erstellen Sie eine neue Datei und speichern Sie sie als index.php in Ihrem Webstamm. Fügen Sie den folgenden Code in den Textkörper ein:

Jetzt haben wir eine einfache XHTML-Seite mit einem Anmeldeformular. Wenn Sie Formularschlüssel auf Ihrer Website verwenden möchten, können Sie das obige Skript durch Ihre eigene Anmeldeseite ersetzen. Fahren wir nun mit der eigentlichen Aktion fort.

Schritt 2: Erstellen einer Klasse

Wir werden eine PHP-Klasse für unsere Formularschlüssel erstellen. Da jede Seite nur einen Formularschlüssel enthalten kann, können wir aus unserer Klasse einen Singleton erstellen, um sicherzustellen, dass unsere Klasse korrekt verwendet wird. Da das Erstellen von Singletons ein fortgeschritteneres OOP-Thema ist, werden wir diesen Teil überspringen. Erstellen Sie eine neue Datei mit dem Namen formkey.class.php und platzieren Sie sie in Ihrem Webstamm. Jetzt müssen wir über die Funktionen nachdenken, die wir brauchen. Zunächst benötigen wir eine Funktion zum Generieren eines Formularschlüssels, damit wir ihn in unser Formular einfügen können. Fügen Sie in Ihre PHP-Datei den folgenden Code ein:

Oben sehen Sie eine Klasse mit drei Teilen: zwei Variablen und einer Funktion. Wir machen die Funktion privat, da diese Funktion nur von unseren output Funktionen verwendet wird, die wir später erstellen werden. In den beiden Variablen werden die Formularschlüssel gespeichert. Diese sind auch privat, da sie nur von Funktionen innerhalb unserer Klasse verwendet werden dürfen.

Jetzt müssen wir uns überlegen, wie wir unseren Formularschlüssel generieren können. Da unser Formularschlüssel eindeutig sein muss (andernfalls haben wir keine Sicherheit), verwenden wir eine Kombination aus der IP-Adresse des Benutzers, um den Schlüssel an einen Benutzer zu binden, mt_rand(), um ihn eindeutig zu machen, und der Funktion uniqid() um es noch einzigartiger zu machen. Wir verschlüsseln diese Informationen auch mit md5(), um einen eindeutigen Hash zu erstellen, den wir dann in unsere Seiten einfügen können. Da wir md5() verwendet haben, kann ein Benutzer nicht sehen, was wir zum Generieren des Schlüssels verwendet haben. Die ganze Funktion:

Fügen Sie den obigen Code in Ihre Datei formkey.class.php ein. Ersetzen Sie die Funktion durch die neue Funktion.

Schritt 3: Einfügen eines Formularschlüssels in unser Formular

Für diesen Schritt erstellen wir eine neue Funktion, die mit unserem Formularschlüssel ein verstecktes HTML-Feld ausgibt. Die Funktion besteht aus drei Schritten:

Generate, Save, Output

  1. Generieren Sie einen Formularschlüssel mit unserer Funktion generateKey().
  2. Speichern Sie den Formularschlüssel in unserer Variablen $formKey und in einer Sitzung.
  3. Geben Sie das HTML-Feld aus.

Wir benennen unsere Funktion outputKey() und machen sie öffentlich, weil wir sie außerhalb unserer Klasse verwenden müssen. Unsere Funktion ruft die private Funktion generateKey() auf, um einen neuen Formularschlüssel zu generieren und ihn lokal in einer Sitzung zu speichern. Zuletzt erstellen wir den XHTML-Code. Fügen Sie nun den folgenden Code in unsere PHP-Klasse ein:

Jetzt fügen wir den Formularschlüssel zu unserem Anmeldeformular hinzu, um ihn zu sichern. Wir müssen die Klasse in unsere index.php-Datei aufnehmen. Wir müssen die Sitzung auch starten, da unsere Klasse Sitzungen zum Speichern des generierten Schlüssels verwendet. Dazu fügen wir den folgenden Code über dem Doctype und dem Head-Tag hinzu:

Der obige Code ist ziemlich selbsterklärend. Wir starten die Sitzung (weil wir den Formularschlüssel speichern) und laden die PHP-Klassendatei. Danach starten wir die Klasse mit neuem formKey(). Dadurch wird unsere Klasse erstellt und in $formKey gespeichert. Jetzt müssen wir unser Formular nur noch so bearbeiten, dass es den Formularschlüssel enthält:

Und das ist alles! Da wir die Funktion outputKey() erstellt haben, müssen wir sie nur in unser Formular aufnehmen. Wir können Formularschlüssel in jedem Formular verwenden, indem wir einfach <?php $formKey->outputKey(); ?> hinzufügen. Überprüfen Sie nun einfach die Quelle Ihrer Webseite und Sie können sehen, dass dem Formular ein Formularschlüssel beigefügt ist. Der einzige verbleibende Schritt besteht darin, Anforderungen zu validieren.

Schritt 4: Validieren

Wir werden nicht das gesamte Formular validieren. nur der Formularschlüssel. Die Validierung des Formulars erfolgt in grundlegendem PHP. Tutorials finden Sie im gesamten Web. Lassen Sie uns den Formularschlüssel validieren. Da unsere Funktion "generateKey" den Sitzungswert überschreibt, fügen wir unserer PHP-Klasse einen Konstruktor hinzu. Ein Konstruktor wird aufgerufen, wenn unsere Klasse erstellt (oder erstellt) wird. Der Konstruktor speichert den vorherigen Schlüssel in der Klasse, bevor wir einen neuen erstellen. Daher haben wir immer den vorherigen Formularschlüssel zur Validierung unseres Formulars. Wenn wir dies nicht tun würden, könnten wir den Formularschlüssel nicht validieren. Fügen Sie Ihrer Klasse die folgende PHP-Funktion hinzu:

Ein Konstruktor sollte immer __construct() heißen. Wenn der Konstruktor aufgerufen wird, prüfen wir, ob eine Sitzung festgelegt ist, und wenn ja, speichern wir sie lokal in unserer Variablen old_formKey.

Jetzt können wir unseren Formularschlüssel validieren. Wir erstellen eine Grundfunktion in unserer Klasse, die den Formularschlüssel validiert. Diese Funktion sollte auch öffentlich sein, da wir sie außerhalb unserer Klasse verwenden werden. Die Funktion überprüft den POST-Wert des Formularschlüssels anhand des gespeicherten Werts des Formularschlüssels. Fügen Sie diese Funktion der PHP-Klasse hinzu:

In index.php validieren wir den Formularschlüssel mithilfe der Funktion, die wir gerade in unserer Klasse erstellt haben. Natürlich validieren wir erst nach einer POST-Anfrage. Fügen Sie den folgenden Code nach $formKey = new formKey() hinzu.

Wir haben eine Variable $error erstellt, in der unsere Fehlermeldung gespeichert ist. Wenn eine POST-Anfrage gesendet wurde, validieren wir unseren Formularschlüssel mit $formKey->validate(). Wenn dies false zurückgibt, ist der Formularschlüssel ungültig und es wird ein Fehler angezeigt. Beachten Sie, dass wir nur den Formularschlüssel validieren. Es wird erwartet, dass Sie den Rest des Formulars selbst validieren.

In Ihrem HTML-Code können Sie den folgenden Code einfügen, um die Fehlermeldung anzuzeigen:

Dies gibt die $error-Variable wieder, wenn sie gesetzt ist.

Form

Wenn Sie Ihren Server starten und zu index.php gehen, sehen Sie unser Formular und die Meldung "Kein Fehler". Wenn Sie ein Formular senden, wird die Meldung "Kein Formularschlüsselfehler" angezeigt, da es sich um eine gültige POST-Anforderung handelt. Versuchen Sie nun, die Seite neu zu laden und zu akzeptieren, wenn Ihr Browser die erneute Übertragung der POST-Daten anfordert. Sie werden sehen, dass unser Skript eine Fehlermeldung auslöst: 'Formularschlüsselfehler!' Ihr Formular ist jetzt vor Eingaben von anderen Websites und Fehlern beim erneuten Laden von Seiten geschützt! Der Fehler wird auch nach einer Aktualisierung angezeigt, da nach dem Absenden des Formulars ein neuer Formularschlüssel generiert wurde. Dies ist gut, da Benutzer jetzt nicht versehentlich zweimal ein Formular veröffentlichen können.

Vollständiger Code

Hier ist der gesamte PHP- und HTML-Code:

index.php

fomrkey.class.php

Abschluss

Das Hinzufügen dieses Codes zu jedem wichtigen Formular auf Ihrer Website erhöht die Sicherheit Ihres Formulars erheblich. Es werden sogar keine Probleme mehr aktualisiert, wie wir in Schritt 4 gesehen haben. Da der Formularschlüssel nur für eine Anforderung gültig ist, ist ein doppelter Beitrag nicht möglich.

Das war mein erstes Tutorial, ich hoffe es gefällt euch und nutzt es, um eure Sicherheit zu verbessern! Bitte teilen Sie mir Ihre Gedanken über die Kommentare mit. Haben Sie eine bessere Methode? Lassen Sie uns wissen.

Weiterführende Literatur

  • Folgen Sie uns auf Twitter oder abonnieren Sie den NETTUTS RSS-Feed, um weitere tägliche Tipps und Artikel zur Webentwicklung zu erhalten.


Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.