2010-09-18 16 views
47

Gibt es eine Möglichkeit, dass ich eine persistente Sitzung in PHP ohne die Platzierung eines Session-Cookie initiieren kann? Gibt es andere Möglichkeiten zum Verwalten einer Sitzung über mehrere Seiten hinweg, z. B. eine IP-Adress-basierte Lösung?PHP Sitzung ohne Cookies

Mein Grund für die Frage ist, dass obwohl die meisten Benutzer Cookies haben, möchte ich sehen, ob es ein Weg für ein Login-System für diejenigen mit deaktivierten funktioniert (obwohl ich denke, Deaktivieren von Cookies ist nur unnötige Paranoia, persönlich).

Antwort

50

Ich glaube nicht, es ist zu viel Ihre Benutzer zu fragen, Cookies zu aktivieren. Ich finde es albern, wenn Leute sie komplett ausschalten.

Andernfalls können Sie Ihre session.use_only_cookies auf "0" setzen, um das Anhängsel einer Sitzungs-ID an URLs in Ihrem PHP zu erzwingen. Dieser Ansatz hat jedoch einige Nachteile. Hauptsächlich, dass der Status innerhalb der URL beibehalten wird, im Gegensatz zum Cookie-Header. Wenn ein Benutzer die URL der Seite kopieren und einfügen würde, auf der er sich befand, und eine andere Person darauf klicken würde, würden beide dieselbe Sitzung verwenden.

<?php 
    ini_set("session.use_cookies", 0); 
    ini_set("session.use_only_cookies", 0); 
    ini_set("session.use_trans_sid", 1); 
    ini_set("session.cache_limiter", ""); 
    session_start(); 
+1

Ich glaube, die OP wollte 'session.use_cookies' auf 1 gesetzt –

+4

Und es sollte beachtet werden, dass diese Einstellungen JS Hyperlinks und Location-Header in PHP-Code nicht ändern. –

+0

Wer bräunt 2010 noch mit Keksen? Obwohl es immer noch möglich ist, bezweifle ich, dass dies noch immer jemand tut; und damit ist die Frage eher akademisch. (Sogar die Spinnen können jetzt Kekse haben) – Piskvor

3

Sie können mit Session-IDs in URLs arbeiten und Deaktivierung von Cookies mit:

ini_set('session.use_cookies', 0); 
ini_set('session.use_only_cookies', 0); 
ini_set('session.use_trans_sid', 1); 
session_start(); 
// IP check 
if($_SESSION['ip_check'] != $_SERVER['REMOTE_ADDR']){ 
    session_regenerate_id(); 
    session_destroy(); 
    session_start(); 
} 
$_SESSION['ip_check'] = $_SERVER['REMOTE_ADDR']; 
// session stuff 

Hinweis: es ist sehr Session-IDs in URLs discougared zu verwenden. IP-Adressen können sich ändern, wenn Sie mit einer Wireless-Karte unterwegs sind und Proxy-Server dieselbe IP-Adresse haben. Beim Klicken auf eine alte URL (mit der alten Sitzungs-ID) kann es leicht beschädigt werden.

Sie könnten auch daran interessiert sein, Ihre eigene Session-Handling-Funktion zu erstellen (in Verbindung mit einer Datenbank). Sie würden die Sitzungs-ID ignorieren und sie an die IP-Adresse binden. (Siehe Beispiele in http://php.net/manual/en/function.session-set-save-handler.php)

Referenzen:

+5

Bindung an eine IP-Adresse scheint ein schlechter Weg zu gehen. Einige (Firmen?) Benutzer können sich hinter einem Proxy befinden, wo mehrere Benutzer dieselbe IP-Adresse haben können. – Leander

+3

@Leander Wooord! Dies kann zu sehr schlechten Situationen führen, in denen der gesamte Firmen-/Familien-/Studentenwohnkomplex Zugang zu Ihrem Benutzerkonto hat. – Sliq

+1

Hier in Deutschland hat der größte ISP (Telekom) sogar einen eigenen Proxy, den viele Leute nutzen. Im schlimmsten Fall verwendet ein ISP Network ein Konto. Das ist wirklich ärgerlich, da es fast unmöglich ist, IP-Adressen zu verbieten, wenn Sie sich nicht auf den Header X-HTTP-Forwarded-For verlassen wollen. – Gellweiler

4

Sie können die ini-Wert von session.use_trans_sid auf true, um jede URL die Session-ID zu aktivieren gesetzt anhängt. Schauen Sie sich this an.

Aus Sicherheitsgründen sollten Sie die Sitzung dann auf die IP beschränken, die die Sitzung erstellt hat. Dies ist jedoch nicht vollkommen sicher, da jemand mit der gleichen IP (beispielsweise hinter einem Proxy) dieselbe Sitzung wiederverwenden kann.

1

Sie können Session-ID per IP in der Datenbank speichern:

erstellen MySQL-Tabelle mit drei Feldern: Sitzungs_ID, ip und einzigartige Temp-Taste (für angemeldete Benutzer) oder jede andere Bedingung, die Sie mögen. Schalte dann Session-Cookies und use_trans_sid aus.

Dann erstellen Sie einen Code, um das Sitzungsverhalten basierend auf dieser neuen Tabelle zu verwalten!

nach session_start() speichern in der Tabelle session_id und später erhalten sie aus der Tabelle (durch IP und jede andere Bedingung) und rufen dann

session_id($in_table_session_id); 

für weitere Informationen und vollständige Anleitung finden Sie unter: https://gist.github.com/mimrahe/77415f4a9e238c313bbe8c42f8a6b7fe

+0

Wieder ist dies verbindlich durch IP und nicht ganz effektiv, insbesondere für Bereiche, in denen mehrere Benutzer die gleiche IP teilen (z. B. Universität, Unternehmen oder Org-Proxys, etc.) –

0

Sie könnten Erstellen Sie einen Datenbankdatensatz oder eine temporäre Datei, und überprüfen Sie bei jeder Seitenladung die Werte $_SERVER vars. Es ist ein Sicherheitsrisiko, aber mit genügend Variablen (sehen Sie sich die Liste here an), haben Sie vielleicht das Gefühl, dass Sie die Chance haben, auf ein akzeptables Niveau herunterzufallen. Nur Sie wissen, wie sicher Ihre App sein muss.