PHP: $ _SESSION - Was sind die Vor- und Nachteile der vorübergehend verwendet, um Daten in der $ _SESSION variable Speicherung

StackOverflow https://stackoverflow.com/questions/77826

  •  09-06-2019
  •  | 
  •  

Frage

Eine Sache, ich habe angefangen, öfter zu tun vor kurzem ist einige Daten abrufen am Anfang einer Aufgabe und es in einem $ _SESSION Speicherung [ 'myDataForTheTask'] .

Nun scheint es sehr bequem, dies zu tun, aber ich weiß nichts über die Leistung, Sicherheitsrisiken oder ähnliches, mit diesem Ansatz. Ist es etwas, das regelmäßig von Programmierern mit mehr Know-how durchgeführt wird, oder ist es eher ein Amateur, was zu tun?

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;
}
War es hilfreich?

Lösung

Nun Session-Variablen wirklich eine der wenigen Möglichkeiten sind (und wahrscheinlich die effizienteste) diese Variablen für die gesamte Zeit, die die Besucher auf der Website ist, dann ist es keine wirkliche Möglichkeit für einen Benutzer sie (anders als ein bearbeiten Exploit im Code oder in dem PHP-Interpreter), so sind sie ziemlich sicher.

Es ist eine gute Möglichkeit, Einstellungen zu speichern, die vom Benutzer geändert werden können, wie Sie die Einstellungen aus der Datenbank einmal zu Beginn einer Sitzung lesen kann, und es ist für die gesamte Sitzung zur Verfügung, müssen Sie nur weitere Datenbank, Anrufe tätigen wenn die Einstellungen geändert werden und natürlich, wie Sie in Ihrem Code zeigen, ist es trivial, um herauszufinden, ob die Einstellungen bereits vorhanden ist oder ob sie benötigen, aus der Datenbank extrahiert werden.

Ich kann nicht glauben, der auf andere Weise sicher temporäre Variablen zu speichern (da Cookies leicht modifiziert werden kann, und dies wird in den meisten Fällen unerwünscht sein) so _SESSION $ wäre der Weg zu gehen

Andere Tipps

$ _ SESSION Mechanismus ist die Verwendung von Cookies.

Bei Firefox (und vielleicht auch neuer IE, ich habe mich nicht kontrollieren), das bedeutet, dass Sitzung zwischen geöffneten Tabs geteilt . Das ist nicht etwas, das Sie standardmäßig erwarten. Und es bedeutet, dass Sitzung ist nicht mehr „etwas Bestimmtes zu einem einzigen Fenster / user“.

Zum Beispiel, wenn Sie zwei Registerkarten geöffnet haben Ihre Website zugreifen, als als root angemeldet, die ersten Reiter, werden Sie root-Rechte in der anderen gewinnen.

Das ist wirklich unbequem, vor allem, wenn Sie Code E-Mail-Client oder etwas anderes (wie e-shop). In diesem Fall müssen Sie Sitzungen manuell oder einführen ständig regeneriert Schlüssel in URL verwalten oder sonst etwas tun.

Ich verwende die Session-Variablen die ganze Zeit Informationen für die Nutzer zu speichern. Ich habe keine Probleme mit der Leistung gesehen. Die Sitzungsdaten werden basierend auf den Cookie gezogen (oder PHPSESSID , wenn Sie Cookies deaktiviert). Ich sehe es nicht mehr ein Sicherheitsrisiko als jede andere Cookie-basierende Authentifizierung zu sein, und wahrscheinlich sicherer als die eigentlichen Daten in dem Benutzer-Cookie gespeichert werden.

Nur, damit Sie wissen, wenn Sie zu tun haben ein Sicherheitsproblem mit dem SQL-Anweisung:

SELECT participationcode, modulearray, wavenum FROM mng_wave WHERE wave_id=".$_GET['wave_id'];

Sie sollten NIE, ich wiederhole NIE , nehmen Benutzerdaten zur Verfügung gestellt und es verwenden, ohne vorher desinfizierende es eine SQL-Anweisung auszuführen. Ich würde es in Anführungszeichen wickeln und die Funktion mysql_real_escape_string() hinzuzufügen. Das werden Sie von den meisten Angriffen schützen. So Ihre Linie würde wie folgt aussehen:

$query_taskinfo = "SELECT participationcode, modulearray, wavenum FROM mng_wave WHERE wave_id='".mysql_real_escape_string($_GET['wave_id'])."'";

Es gibt ein paar Faktoren, die Sie in Betracht ziehen würden bei der Entscheidung, wo temporäre Daten zu speichern. Session-Speicherung ist für die Daten, die spezifisch für einen einzelnen Benutzer ist. Wenn Sie den standardmäßige dateibasierte Session-Speicher Handler zu finden, ist ineffizient Sie etwas anderes implementieren kann, möglicherweise eine Datenbank oder memcache Art von Backend verwenden. Siehe session_set_save_handler für weitere Informationen.

Ich finde es eine schlechte Praxis zu speichern gemeinsame Daten in der Sitzung eines Benutzers. Es gibt bessere Orte zum Speichern von Daten, die von mehreren Benutzern häufig zugegriffen werden, und durch diese Daten in der Sitzung zu speichern können Sie die Daten für jeden Benutzer zu duplizieren, die diese Daten benötigt. In Ihrem Beispiel könnten Sie eine andere Art von Speicher-Engine für diese Wellendaten (basierend auf wave_id), die sich insbesondere nicht an der Sitzung eines Benutzers gebunden einrichten. Auf diese Weise können die Daten ziehen werde nach unten einmal und sie es irgendwo speichern, dass mehrere Benutzer auf die Daten, ohne dass eine weitere Pull zugreifen können.

Wenn Sie auf Ihrem eigenen Server laufen lassen, oder in einer Umgebung, wo niemand auf Ihren Dateien / Speicher auf dem Server schnüffeln kann, sind Sitzungsdaten sicher. Sie sind auf dem Server gespeichert und nur einen Identifizierungs-Cookie an den Client gesendet. Das Problem ist, wenn andere Leute das Cookie schnappen können und imitieren jemand anderes, natürlich. Mit HTTPS und sicherstellen, dass nicht die Session-ID in URLs setzen sollten Ihre Benutzer von den meisten dieser Probleme sicher halten. (XSS kann weiterhin verwendet werden, Cookies zu schnappen, wenn Sie nicht vorsichtig sind, finden Sie unter JeeF Atwoods Post auf diese auch.)

Wie für das, was in einer Sitzungsvariablen zu speichern, setzen Sie Ihre Daten dort, wenn Sie auf einer anderen Seite wieder beziehen mögen, wie ein Warenkorb, aber es nicht dort setzen, wenn es nur temporäre Daten ist, die zur Herstellung des Ergebnis dieser Seite, wie eine Liste von Tags für den aktuell angezeigten Beitrag. Sessions sind für pro Benutzer persistenten Daten.

Eine weitere Möglichkeit, die Eingabevalidierung zu verbessern, ist die _GET [ 'wave_id'] Variable werfen:

$query_taskinfo = "SELECT participationcode, modulearray, wavenum FROM mng_wave WHERE wave_id=".(int)$_GET['wave_id']." LIMIT 1";

Ich bin Vermutung wave_id eine ganze Zahl, und dass es nur eine Antwort.

Will

Ein paar andere Nachteile der Verwendung von Sitzungen:

  1. $_SESSION Daten verfallen nach session.gc_maxlifetime Sekunden Inaktivität.
  2. Sie müssen sich daran zu erinnern session_start() für jedes Skript aufrufen, die die Sitzungsdaten verwenden.
  3. Skalierung der Website durch Load-Balancing über mehrere Server ein Problem sein könnte, da der Benutzer jedes Mal auf dem gleichen Server gerichtet werden müssen. Lösen Sie diese mit "Sticky Sessions".

$ _ SESSION Elemente werden in der Session gespeichert, das ist standardmäßig gehalten auf dem Datenträger. Es gibt keine Notwendigkeit, Ihre eigene Array zu machen und es in einem ‚Dataentry‘ Array-Eintrag zu stopfen wie Sie haben. Sie können nur $ _SESSION verwenden [ 'pcode'], $ _SESSION [ 'Module'] und so weiter.

Wie ich schon sagte, wird die Sitzung auf der Festplatte gespeichert und ein Zeiger auf die Sitzung wird in einem Cookie gespeichert. Der Benutzer somit nicht leicht kann ahold der Sitzungsdaten erhalten.

IMO, es ist durchaus akzeptabel, die Dinge in der Sitzung zu speichern. Es ist eine gute Möglichkeit, Daten dauerhaft zu machen. Es ist auch in vielen Fällen sicherer als alles, was in Cookies gespeichert werden. Hier sind ein paar Bedenken:

  • Es ist möglich, dass jemand eine Sitzung kapern, so dass, wenn du gehst, es zu benutzen, den Überblick über die Benutzerautorisierung zu halten, vorsichtig sein. Lesen Sie dieser für weitere Informationen.
  • Es kann ein sehr faul Weg sein, um Daten zu halten. Nicht nur alles in der Sitzung werfen, so dass Sie nicht für sie später abgefragt werden.
  • Wenn Sie vorhaben, Objekte in der Sitzung zu speichern, entweder ihre Klassendateien müssen aufgenommen werden, bevor die Sitzung auf die nächste Anforderung gestartet wird oder Sie ein Auto-Loader konfiguriert haben müssen.

Zend Framework hat eine nützliche Bibliothek für die Verwaltung von Sitzungsdaten, die mit Ablauf und Sicherheit (für Sachen wie Captchas) hilft. Sie haben auch eine nützliche Erklärung von Sitzungen. Siehe http://framework.zend.com/manual/en/zend.session .html

Ich habe Sitzungen gefunden sehr nützlich zu sein, aber ein paar Dinge zu beachten:

1) Das PHP können Ihre Sitzungen in einem Ordner tmp oder anderen Verzeichnis speichern, die für andere Benutzer auf dem Server zugegriffen werden kann. Sie können das Verzeichnis ändern, wurden Sitzungen, indem Sie auf die php.ini-Datei gespeichert werden.

2) Wenn Sie einen hohen Wert System einrichten, die sehr strengen Sicherheitsvorkehrungen benötigt, um die Daten verschlüsseln möchten, bevor Sie es an die Sitzung zu senden und entschlüsseln, es zu benutzen. . Hinweis: dies könnte erstellen zu viel Aufwand je nach Verkehr / Serverkapazität

3) Ich habe festgestellt, dass session_destroy (); nicht die Sitzung löschen sofort, müssen Sie nach wie vor für die PHP-Garbage-Collector warten, um die Sitzungen aufzuräumen. Sie können die Frequenz ändern, die die Garbage Collector in der php.ini-Datei ausgeführt wird. Aber noch scheint nicht sehr zuverlässig, weitere Informationen http: //www.captain. at / Howto-php-sessions.php

Sie möchten vielleicht überlegen, wie REST-ful ist das?

d. siehe "Communicate statelessly" Absatz in " Eine kurze Einführung in REST " ...

  

"Mandate sein, dass Staat entweder   verwandelte sich in Ressourcenzustand oder gehalten auf   der Kunde. Mit anderen Worten, ein Server   sollte nicht irgendeine Art von behalten müssen   Kommunikationszustand für eine der   Kunden mit über eine in Verbindung steht   einzelne Anforderung. "

(oder eine der anderen Links auf Wikipedia für REST )

So in Ihrem Fall die ‚wave_id‘ ist eine sinnvolle Ressource zu bekommen, aber wollen Sie wirklich, es zu speichern, in der Sitzung? Sicher Memcached ist Ihre Lösung für das Objekt Ressource Cacheing?

ich diesen Ansatz ein gutes Stück zu verwenden, ich sehe kein Problem mit ihm. Im Gegensatz zu Cookies, die Daten werden nicht auf der Client-Seite gespeichert, die oft ein großer Fehler.

Wie alles aber nur vorsichtig sein, dass Sie immer Benutzereingabe Hygienisierung, vor allem, wenn Sie Benutzereingaben in den $ _SESSION Variable setzen sind, dann später diese Variable in einer SQL-Abfrage verwendet wird.

Dies ist eine ziemlich gemeinsame Sache zu tun, und die Sitzung ist in der Regel schneller als Treffer kontinuierliche Datenbank sein wird. Sie sind auch ziemlich sicher, da die PHP Entwickler hart gearbeitet haben, Session Hijacking zu verhindern.

Das einzige Problem ist, dass Sie die Sitzung Eintrag neu zu erstellen, wenn sich etwas ändert sich merken müssen. Und wenn irgendetwas von einem Benutzer andere als die geändert wird, der die Sitzung besitzt, die in einer Notwendigkeit führen würde diesen Schlüssel zu aktualisieren, gibt es keine einfache Möglichkeit, das System zu benachrichtigen, diesen Sitzungsschlüssel zu aktualisieren. Möglicherweise keine große Sache, aber etwas, das Sie sollten sich bewusst sein.

$ _ SESSION ist sehr nützlich bei der Sicherheit, da es sich um eine serverseitige Art und Weise ist es, Informationen zu speichern, während ein Benutzer aktiv auf Ihren Seiten ist daher schwer zu hacken, wenn Ihre tatsächlichen PHP-Datei oder Server Schwächen hat, die ausgenutzt werden. Eine sehr gute Implementierung speichert eine Variable, um zu bestätigen, dass der Benutzer angemeldet ist, und nur so dass Maßnahmen ergriffen werden, wenn sie in bestätigt angemeldet.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top