PHP: $_SESSION - Was sind die vor-und Nachteile der Speicherung von temporär verwendeten Daten in der $_SESSION variable
Eins hab ich angefangen, immer häufiger in letzter Zeit ist abrufen einiger Daten am Anfang einer Aufgabe und Speicherung in einer $_SESSION['myDataForTheTask'].
Nun scheint es sehr bequem zu tun, aber ich weiß nichts über die performance, die Sicherheit Risiken oder ähnlich, mit diesem Ansatz. Ist es etwas, das regelmäßig getan durch Programmierer mit mehr Erfahrung, oder ist es eher ein amateur was zu tun?
Zum Beispiel:
if (!isset($_SESSION['dataentry']))
{
$query_taskinfo = "SELECT participationcode, modulearray, wavenum FROM mng_wave WHERE wave_id=" . mysql_real_escape_string($_GET['wave_id']);
$result_taskinfo = $db->query($query_taskinfo);
$row_taskinfo = $result_taskinfo->fetch_row();
$dataentry = array("pcode" => $row_taskinfo[0], "modules" => $row_taskinfo[1], "data_id" => 0, "wavenum" => $row_taskinfo[2], "prequest" => FALSE, "highlight" => array());
$_SESSION['dataentry'] = $dataentry;
}
- Dein SQL-query ist anfällig für SQL-injection-Angriffe. Zum Beispiel könnte jemand setzen '?wave_id=wave_id' und die Abfrage würde alle Zeilen auswählen. (Es ist schlimmer mit DELETE, INSERT und UPDATE Abfragen.) In diesem Fall müssen Sie code schreiben, um sicherzustellen, dass es eine Zahl ist, und der einfachste Weg dies zu tun, ist intval()
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sowie Session-Variablen sind eigentlich die einzige Möglichkeit (und wahrscheinlich die meisten effizient), die diese Variablen für die gesamte Zeit, die Besucher auf der website, es gibt keine echte Möglichkeit für einen Benutzer, um Sie zu Bearbeiten (andere als ein exploit in code, oder in der PHP-interpreter), so sind Sie ziemlich sicher.
Es ist eine gute Möglichkeit der Speicherung von Einstellungen, die geändert werden können, indem die Benutzer, wie Sie können, Lesen Sie die Einstellungen aus der Datenbank einmal am Anfang einer Sitzung, und es ist möglich, dass für die gesamte Sitzung, müssen Sie nur weitere Datenbank-Aufrufe, wenn die Einstellungen geändert werden, und natürlich, wie Sie in Ihrem code, es ist trivial, um herauszufinden, ob die Einstellungen bereits vorhanden sind, oder ob Sie gezogen werden müssen, um aus der Datenbank.
Ich kann mir nicht vorstellen, dass es eine andere Art der Speicherung von temporären Variablen fest (da cookies können leicht geändert werden und dies unerwünscht sein, in den meisten Fällen) so $_SESSION wäre der Weg zu gehen
$_SESSION Mechanismus ist die Verwendung von cookies.
Im Falle von Firefox (und vielleicht neuen IE, ich habe nicht überprüfen Sie selbst) das bedeutet, dass Sitzung geteilt zwischen geöffneten tabs. Das ist nicht etwas, was erwarten Sie standardmäßig. Und es bedeutet, dass die Sitzung nicht mehr "etwas bestimmtes zu einem einzigen Fenster/Benutzer".
Zum Beispiel, wenn Sie geöffnet haben zwei Registerkarten, um Zugang zu Ihrer Website, als angemeldet als root mit dem ersten tab, wirst du root-Rechte in der anderen.
Dass ist wirklich unangenehm, vor allem, wenn Sie code e-mail-client oder etwas anderes (wie z.B. e-shop). In diesem Fall müssen Sie zum verwalten von sessions manuell oder einzuführen, die ständig regeneriert key in URL oder etwas anderes tun.
Ich die session-variable die Zeit, die zum speichern von Informationen für die Nutzer. Ich habe nicht gesehen, keine Probleme mit performance. Die session-Daten gezogen wird, basierend auf dem cookie (oder PHPSESSID wenn Sie haben cookies deaktiviert). Ich sehe es nicht mehr ein Sicherheitsrisiko als alle anderen cookie-basierende Authentifizierung und wahrscheinlich sicherer als das speichern der tatsächlichen Daten in der Nutzer-cookie.
Nur, damit Sie wissen, wenn Sie haben ein Sicherheitsproblem mit der SQL-Anweisung:
Sollten Sie NIE, ich WIEDERHOLE NIE, nehmen Nutzer zur Verfügung gestellten Daten und verwenden Sie es zum ausführen einer SQL-Anweisung ohne zuerst bereinigen es. Ich würde wickeln Sie es in Anführungszeichen und fügen Sie die Funktion
mysql_real_escape_string()
. Das schützt Sie vor den meisten Angriffen. Damit Ihre Zeile würde wie folgt Aussehen:Gibt es ein paar Faktoren, die Sie wollen zu berücksichtigen, bei der Entscheidung, wo, um temporäre Daten zu speichern. Session storage ist ideal für Daten, die spezifisch für einen einzelnen Benutzer. Wenn Sie die standardmäßige Dateibasierte session-Speicher-handler ist ineffizient, die Sie umsetzen können, etwas anderes, evtl. mit einer Datenbank oder memcache Art von backend. Sehen session_set_save_handler für mehr info.
Ich finde es ist eine schlechte Praxis, um zu speichern gemeinsame Daten in die session eines Benutzers. Es gibt bessere Orte zum speichern von Daten, die Häufig zugegriffen wird, die von mehreren Anwendern und das speichern dieser Daten in der session werden Sie duplizieren die Daten für jeden Benutzer benötigt diese Daten. In Ihrem Beispiel könnten Sie einrichten, eine andere Art von Speicher-engine für diese wave-Daten (basierend auf wave_id), die NICHT gebunden ist speziell auf die Sitzung eines Benutzers. Auf diese Weise werden Sie ziehen die Daten ab, einmal und speichern Sie es irgendwo, dass mehrere Benutzer auf die Daten zugreifen können, ohne dass ein anderes ziehen.
Wenn Sie auf Ihrem eigenen server, oder in einer Umgebung, wo niemand kann snoop auf Ihre Dateien/Speicher auf dem server, die session-Daten sind sicher. Sie sind auf dem server gespeichert und nur ein Identifizierungs-cookie an den client gesendet. Das problem ist, wenn andere Leute schnappen kann den cookie und jemand anderes auszugeben, natürlich. HTTPS verwenden und darauf achten, nicht die session-ID in URLs sollten verhindern, dass Ihre Benutzer sicher von den meisten dieser Probleme. (XSS kann immer noch verwendet werden, um entreißen cookies, wenn Sie nicht vorsichtig sind, finden Sie Jeef Atwoods post auf dieses zu.)
Als für das, was zu speichern, in einer session-Variablen, Ihre Daten dort, wenn Sie wollen, finden Sie es wieder auf der anderen Seite, wie ein Warenkorb, aber setzen Sie es nicht dort, wenn es sich nur um temporäre Daten, die für die Herstellung das Ergebnis von dieser Seite, wie Sie eine Liste der tags für das aktuell angezeigte post. Sitzungen sind für pro-user persistente Daten.
Eine weitere Möglichkeit zur Verbesserung der input-Validierung ist das wirken des _GET['wave_id'] variable:
Ich vermute wave_id ist eine ganze Zahl, und dass es nur eine Antwort.
Wird
Ein paar andere Nachteile der Verwendung von sessions:
$_SESSION
Daten verfallen nach Sitzung.gc_maxlifetime Sekunden Inaktivität.session_start()
für jedes script, das die session-Daten.$_SESSION Elemente sind in der session gespeichert, die standardmäßig auf Platte gespeichert. Es gibt keine Notwendigkeit, um Ihren eigenen array und Dinge, die es in einer "dataentry" array-Eintrag, wie Sie es getan haben. Sie können verwenden Sie einfach $_SESSION['P-Code'], $_SESSION['Module'] und so weiter.
Wie gesagt, die Sitzung wird auf der Festplatte gespeichert, und ein Zeiger auf die session in einem cookie gespeichert wird. Der Nutzer kann damit nicht leicht zu bekommen ahold von der session-Daten.
IMO, es ist durchaus akzeptabel, Dinge zu speichern in die session. Es ist eine großartige Möglichkeit, um Daten persistent. Es ist auch in vielen Fällen sicherer als das speichern alles in cookies. Hier sind ein paar Bedenken:
Zend Framework hat eine nützliche Bibliothek für session-Daten-management, die hilft, mit Ablauf und Sicherheit (für Sachen wie captchas). Sie haben auch eine nützliche Erklärung der Sitzungen. Sehen http://framework.zend.com/manual/en/zend.session.html
Ich fand die Sitzungen sehr nützlich zu sein, aber ein paar Dinge zu beachten:
1), Dass die PHP-speichern Sie Ihre Sitzungen in einem tmp-Ordner oder ein anderes Verzeichnis, die zugänglich sein können für andere Benutzer auf Ihrem server. Sie können das Verzeichnis ändern, wurden die Sitzungen werden gespeichert, indem Sie auf der php.ini-Datei.
2) Wenn Sie eine hohe Wert-system, muss sehr eng Sicherheit, möchten Sie vielleicht, um die Daten zu verschlüsseln, bevor Sie Sie senden, um die Sitzung, und zu entschlüsseln, um es zu benutzen. Hinweis: dies möglicherweise zu viel Aufwand je nach traffic /server-Kapazität.
3) ich habe festgestellt, dass session_destroy(); löscht nicht die session sofort, Sie müssen noch warten, bis der PHP garbage collector-reinigen Sie die Sitzungen auf. Sie können die Häufigkeit ändern, dass der garbage collector ausgeführt wird, in der php.ini-Datei. Aber noch scheint nicht sehr zuverlässig, mehr info http://www.captain.at/howto-php-sessions.php
Möchten Sie vielleicht zu berücksichtigen, wie die REST-ful ist das?
d.h. sehen "Kommunizieren statelessly" Absatz "Eine Kurze Einführung zu REST"...
(oder einen der anderen links, die auf wikipedia für REST)
Also in deinem Fall, die 'wave_id' ist eine sinnvolle Ressource zu ERHALTEN, aber wollen Sie wirklich speichern Sie es in der SITZUNG? Sicherlich memcached ist Ihre Lösung zum Cachen der Objekt-Ressource?
Ich diesen Ansatz ein gutes Stück, ich sehe kein problem mit ihm. Im Gegensatz zu cookies, die Daten werden nicht gespeichert auf der client-Seite, das ist oft ein großer Fehler.
Wie alles andere, wenn, nur vorsichtig sein, dass Sie immer die Bereinigung von Benutzereingaben, vor allem, wenn Sie setzen die Benutzereingaben in die $_SESSION-variable, die dann später mit, dass eine variable in einer SQL-Abfrage.
Dies ist eine ziemlich gemeinsame Sache zu machen, und die Sitzung wird in der Regel gehen, schneller zu sein als die kontinuierliche Datenbank trifft. Sie sind auch einigermaßen sicher, da die PHP-Entwickler haben hart gearbeitet, um zu verhindern, dass Session-Hijacking-Angriffe.
Das einzige Problem ist, dass Sie benötigen, zu erinnern, neu zu erstellen die Sitzung Eintritt, wenn sich etwas ändert. Und, wenn nichts geändert wird, von einem anderen Benutzer als derjenige, der besitzt, die Sitzung, das Ergebnis wäre in einer aktualisieren müssen diesen Schlüssel, es gibt keine einfache Möglichkeit, benachrichtigt das system zu aktualisieren diese session-key. Vielleicht keine große Sache, aber sowas sollte man sich bewusst sein.
$_SESSION ist sehr nützlich in Sicherheit, denn es ist ein server-Seite die Möglichkeit, Informationen zu speichern, während ein Benutzer aktiv auf Ihren Seiten, daher schwer zu hacken, es sei denn, Ihre eigentliche php-Datei oder server-Schwächen hat, die genutzt werden. Eine sehr gute Umsetzung ist die Speicherung einer variable, um zu bestätigen, dass der Benutzer angemeldet ist, und nur so dass Maßnahmen ergriffen werden, wenn Sie bestätigt sind angemeldet.