Wie teilt man Laravel Sitzung mit Knoten?

8

Ich richte einen socket.io-Server ein, um Socket-Anfragen zu bearbeiten. Dies läuft auf Port 1234. Dies läuft entlang einer Laravel 5.1-Anwendung. Laravel verwendet redis, um Sitzungen zu behandeln.

Ich habe viele Tutorials, um Laravel mit socket.io zu verbinden, es ist alles ziemlich geradlinig. Ich kann Nachrichten verbinden, antworten und weiterleiten, zurück in den Socket und zur Laravel-Anwendung.

Jedoch vermeidet jedes Tutorial den Auth-Teil dieses Setups. Sobald die Nachricht im Socket 1234 empfangen wurde, wie kann ich diese Nachricht an Laravel weiterleiten, während ich sicherstelle, dass die Anfrage autorisiert ist.

Idealerweise würde ich einfach die Sitzung teilen und das XSRF-Token verifizieren. Da sich die beiden Anwendungen auf unterschiedlichen Ports befinden, kann ich die Sitzung nicht direkt aufnehmen.

Gegenwärtig verwende ich einen alternativen Ansatz, der Folgendes beinhaltet:

  • Nach der Socket-Verbindung (im Knoten) entschlüssele ich den Cookie, der bei der Verbindung mit der Crypto-Bibliothek des Knotens und der PHPUnserialise-Bibliothek des Knotens gesendet wurde.
  • Dies gibt mir die Laravel Session ID (aus dem Cookie)
  • Ich verwende dies, um auf die Redis-Laravel-Sitzung zuzugreifen
  • Ich entschlüssele dann diese Sitzung, die mir wiederum Zugriff auf die Benutzer-ID gibt

Es funktioniert, aber ich glaube, dass es möglicherweise ein Sicherheitsloch sein könnte, weil ich nicht eigentlich _token verwende, um den Ursprung zu verifizieren.

    
Chris 12.09.2015, 12:47
quelle

2 Antworten

7

Ich denke, Ihr Code ist richtig und vielleicht der einzige Weg, dies zu tun. Eine Session-ID wird normalerweise im Cookie gespeichert und muss irgendwann an den Server gesendet werden. Da Knoten und PHP verschiedene Sprachen sind, können sie eine Sitzung nicht direkt teilen. Sie benötigen immer einen Zwischenspeicher wie redis, mysql oder filesystem. Und natürlich eine Möglichkeit, die Sitzung abzurufen. Der Schlüssel zum Abrufen einer Sitzung ist natürlich die Session-ID.

Ein interessanter Beitrag über das Sichern von Websockets:

Ссылка

Er schlägt vor, einen zufällig generierten Schlüssel zu Ihrer Sitzung hinzuzufügen, den Sie überprüfen können, wenn Sie die Websocket-Verbindung herstellen.

Die Session-ID selbst ist bereits zufällig, aber diese Session-IDs sind normalerweise langlebig, so dass eine kurzlebige zufällige ID die Sicherheit erhöhen könnte. Kurzlebige sollten so kurz wie möglich sein: Lassen Sie PHP zur Datenbank hinzufügen, und sobald die Verbindung im Knoten verifiziert ist, entfernen Sie sie aus der Datenbank, damit Sie sie nicht erneut verwenden können.

Es gibt viele zusätzliche Techniken zur Sitzungsüberprüfung, wie das Überprüfen der Browserzeichenfolge oder das Fixieren einer Sitzung an einer IP-Adresse:

Ссылка

Ich würde diese Art von Prüfungen nicht empfehlen, da sie nicht wirklich viel zusätzliche Sicherheit bieten, sondern nur Ärger mit dem Endbenutzer.

Am wichtigsten finde ich das:

  • Sie verwenden eine sichere Art der Kommunikation session_id usw. Dies bedeutet HTTPS
  • Sitzungen sollten ablaufen, wenn der Benutzer den Browser schließt
  • Der Benutzer sollte benachrichtigt werden, wenn er sich von einem anderen Standort aus anmeldet oder Zugriff auf sein "log log"
  • hat
Jimbolino 13.09.2015, 03:52
quelle
0

Ich hatte vor etwa einem Jahr eine gute Lösung dafür gefunden. Ich entschied mich dafür, es zu einem Modul zu machen, es ist wirklich einfach zu benutzen. hilft Ihnen, den Cookie zu bekommen, ohne ihn hart zu codieren. hilft Ihnen, diese Sitzungs-ID zu erhalten und sie von mysql und redis zu erhalten

Ссылка

    
Ricardo Spear 07.07.2016 03:44
quelle

Tags und Links