Ich kenne zwei Möglichkeiten, Parameter zwischen Seiten zu übergeben:
<input type="hidden">
$_SESSION["variable_name"]
Ich finde den zweiten Weg einfacher, aber ich frage mich, ob es so sicher ist wie der erste, denn in den meisten Tutorials, die ich sehe, benutzen sie den ersten Weg.
Gibt es einen wichtigen Grund, den ersten Weg zum zweiten vorzuziehen?
Um den Unterschied zu verstehen, gehen wir im Detail durch, wie die einzelnen Lösungen funktionieren und welche Sicherheitsrisiken bestehen. In diesem Beispiel speichern wir die Anzahl der Seitenansichten des Benutzers.
Wir starten die Sitzung, erhöhen den Zähler und speichern ihn im Array $_SESSION
:
Wenn ein Benutzer diese Seite zum ersten Mal aufruft, erzeugt PHP eine zufällige Sitzungskennung, die wie folgt aussieht, und fordert den Browser auf, diese ID in einem Cookie zu speichern:
%Vor% Auf dem Server wird gespeichert und erinnert, dass es eine Variable pageviews
mit dem Wert 1
gibt, der zur Sitzungs-ID fh4giqncq25ntgs7gjunvj6i33
gehört.
Wenn der Benutzer das nächste Mal die Seite besucht, sendet sein Browser die vorherige Sitzungs-ID zusammen mit der Anfrage (vorausgesetzt, der Cookie ist nicht abgelaufen oder wurde gelöscht). PHP erkennt dann diese ID und füllt das $_SESSION
-Array mit pageviews = 1
und inkrementiert es dann: pageviews = 2
Beziehen Sie in Bezug auf die Sicherheit die folgenden Fragen:
Kann der Benutzer die gespeicherten Daten lesen? Nein - Das einzige, was der Client sieht, ist die zufällige Sitzungs-ID im Cookie. Die Daten selbst werden auf dem Server gespeichert.
Kann der Benutzer die gespeicherten Daten ändern oder manipulieren? Auch hier kein - Wenn die Sitzungs-ID im Browser geändert wird, kann PHP den Browser nicht mehr an die gespeicherten Daten binden. In diesem schlimmsten Fall erhält der Benutzer eine neue Sitzung, beginnend mit pageviews = 1
.
Das größte Sicherheitsrisiko von Sitzungen besteht in Session-Hijacking , wenn ein Angreifer es irgendwie schafft, die Sitzungs-ID von einem anderen Browser abzurufen und sie dann dem Server zu präsentieren, wodurch er sich als anderer Benutzer ausgibt. In unserem Beispiel würde das nicht viel Sinn machen, da wir nur eine Anzahl von Seitenaufrufen speichern; Die meisten Websites verwenden jedoch Sitzungen, um zu verfolgen, welcher Benutzer von welchem Browser aus angemeldet ist. In diesem Fall würde das Stehlen einer anderen Sitzung den Zugriff auf ihr Konto bedeuten.
In diesem Fall haben wir ein Formular mit einem versteckten Feld:
%Vor% Auf dem Server rufen wir die Variable pageviews
von $_POST
ab und inkrementieren sie:
Anstatt also die Daten auf dem Server zu speichern, senden wir die Daten im Wesentlichen an den Client und erwarten ihn in der nachfolgenden Anfrage. Abgesehen von der Tatsache, dass es nur mit POST Anfragen funktioniert, schauen wir uns die sicherheitsrelevanten Nachteile dieser Lösung an:
Kann der Benutzer die gespeicherten Daten lesen? Ja - es geht direkt in den Browser im HTML-Code.
Kann der Benutzer die gespeicherten Daten ändern oder manipulieren? Ja - Es gibt nichts, was den Benutzer daran hindert, die Entwicklerwerkzeuge in seinem Browser zu öffnen und den versteckten Wert zu ändern, was er will. Nach dem Absenden des Formulars erhält der Server die geänderten Daten.
Das Problem mit <input type="hidden">
ist, dass Sie nur dem Client nicht vertrauen können . Sie müssen also die Daten überprüfen, die Sie in jeder Anfrage erhalten. Es könnte sinnvoll sein, dies in einigen Fällen zu tun, z. B. das Ausfüllen von mehrseitigen Formularen, aber selbst das kann oft besser mit Sitzungen gelöst werden.
Das Beibehalten von Daten über $_SESSION
ist im Allgemeinen sicherer als die Verwendung von <input type="hidden">
, da die Sitzungsdaten auf dem Server gespeichert sind und daher vom Client nicht manipuliert werden können. Nur eine zufällige Sitzungskennung wird in einem Cookie an den Browser gesendet, der die Daten auf dem Server mit diesem bestimmten Browser verbindet.