2012-06-22 5 views
7

Auf unseren Websites möchten wir es ermöglichen, Sitzungen für mehrere Domänen zu teilen. Alle diese Websites befinden sich auf demselben Server, aber einige von ihnen haben eine andere IP-Adresse.Wie man eine einzigartige Sitzungs-ID in PHP generiert

Die mögliche Lösung war ich fand mich die Session-ID zu setzen:

<?php 
session_id($someUniqueHash); 
?> 

Und das funktioniert, wenn ich den Hash wie md5 ('test') zu machen. Auf einer anderen Domain auf demselben Server haben wir die Sitzung erneut.

Das Problem erzeugt die ID. Ich sehe einige Lösungen im Internet mit Microtime usw., aber wenn ich diesen Ansatz verwende, kann ich die Session ID auf der anderen Domain/PHP Seite nicht vorhersagen.

Hat jemand eine Idee? Oder sollten wir das nicht umsetzen? Gibt es andere Möglichkeiten, Sitzungen über mehrere Domains zu teilen? (NICHT Subdomains!)

+1

Warum lassen Sie PHP nicht die Sitzungs-ID für Sie generieren? Sie können Sitzungs-IDs über mehrere Domänen hinweg teilen. Entweder handelt es sich um den Cookie * oder * um einen Abfrageparameter zu übergeben. – hakre

+0

Der Abfrageparameter wird nicht bevorzugt, ist unsicher und nicht URL-freundlich. Soweit ich weiß, erlauben Sie Cookies nur die gleiche Domain (auch Subdomains) nicht Multidomains. –

+0

Es ist nur ein Cookie, den du passierst. Und Sie können Cookies für Drittanbieter-Domains, so genannte Third-Party-Cookies, erstellen. Möglicherweise müssen Sie dazu auch die rechtliche Seite überprüfen (neben der technischen Seite, die gelöst wird). Btw alle technischen Details, über die Sie vielleicht erfahren möchten: [HTTP State Management Mechanismus RFC6265] (http://tools.ietf.org/html/rfc6265) – hakre

Antwort

4

ich dieses System erreicht habe, indem sie einen OAuth Typen Flow verwenden, aber wir die Verbraucher mit dem Benutzer ersetzt.

So würde jede Domäne das authentifizierte Access_Token in einer eigenen Sitzung haben. Sie würden dann das Access_Token verwenden, um Informationen über den Benutzer von einer API zu erhalten.

Ich löste auch das Sitzungsproblem mit session_set_save_handler und Speichern von Sitzungen in einer Datenbanktabelle ... Diese Tabelle würde die Access_Token auch haben, so dass es wirklich einfach, die Sitzung mit einer DB-Abfrage zu finden.

Hoffe das hilft mit Ideen.

+0

Ich habe darüber nachgedacht, dies in letzter Zeit zu tun. Ich frage mich, ob es eine Fallstudie oder eine einfache Diskussion über die Speicher- und Wiederherstellungsleistung gibt, indem Sie das Zugriffstoken in eine db-Tabelle hinzufügen und jede Anforderung abfragen. –

0

Hmm das ist ein schwieriges.

Wie jeder weiß, verwendet PHP Cookies, um session_ids zu verstehen, wenn ein Benutzer zu Ihrer Site zurückkehrt und es keine Möglichkeit für domänenübergreifende Cookies gibt: Cross domain cookies (edit: da ist aber die Methode kompliziert).

Dies ist wahrscheinlich, warum ich nie gesehen habe, dass eine Website dies implementiert, obwohl sie unterschiedliche Domänen haben.

Sie könnten über einen Link auf Ihrer Seite von einer Domäne die Session-ID über $ _GET oder $ _POST an die nächste Domain weitergeben. Dies funktioniert nicht, wenn der Benutzer Ihre andere Website direkt eingibt.

Die einzige teilweise (nicht zuverlässige) Methode, die ich finden kann, ist, eine Aufzeichnung des Benutzers comptuer in der Datenbank aufzuzeichnen und zu verwenden, um zu verstehen, an welcher Sitzung es angehängt ist. Sie beherbergen die IP-Adresse des Computers und vielleicht einige andere Details, und das wird auf eine Sitzung zurückgesetzt.

Die IP und andere Details eines Personen-Computers würden sie in die andere Domäne protokollieren.

+0

Tnx. Es gibt eine Website, die es tut: http://www.laptopshop.nl zum Beispiel. Ich weiß, dass ihre Website in PHP entwickelt wurde, also ist es möglich. Aber ich hatte Angst, es war hart. –

+0

Ich korrigiere meine Antwort Cross-Domain-Cookies sind möglich, aber solide wie in diesem Beitrag erwähnt, aber ja Cross-Domain-Sitzungen sind wirklich unzuverlässig ... – Sammaye

0

Vielleicht ist dies keine Option für Sie, aber Sie könnten dies versuchen.

Auf Ihrer Hauptseite generieren Sie die Sitzungs-ID wie normal und um die Sitzung in einer anderen Domäne zu verewigen, können Sie Bild-Tags mit der Sitzungs-ID in die URL einfügen. Als Antwort darauf wird die andere Domäne einen Cookie setzen, so dass der Besucher die Sitzungs-ID bereits kennt, wenn er dorthin kommt.

Fühlt sich ein bisschen Smarty-Hosen-Lösung, aber es sollte funktionieren, wenn Sie nicht zu viele andere Domänen :) Cookies von Drittanbietern können separat in Browsern btw deaktiviert werden, etwas zu prüfen.

Ach ja, Session Annahme (Annahme einer ID über Abfrage-Parameter und Setzen eines Cookies) ist heikel und sollte geschützt werden, d. H. Sitzung muss bereits vorhanden sein, bevor Cookie gesetzt wird.

0

Konfigurieren Sie jede Website individuell:

<?php 

$cfgsession['file'] = "../sessions_global.txt"; 
$cfgsession['keepalive'] = 7200; 

?> 

Um mehrere Websites teilen Sitzungen zu machen, lassen Sie ihnen die gleiche $cfgsession['file'] verwenden. Fügen Sie eine Sitzung von einer Site in eine Anfrage zu einer anderen Domain ein (vielleicht wie von Jack empfohlen), und solange Sie sie nicht in einem anderen Browser abfangen (bitte tun Sie etwas Session-Hijacking zu hemmen) Lassen Sie sie eine Sitzung mit $ _GET angeben. Zum Beispiel:

include ("../session.php"); 
if (isset($_COOKIE['session'])) session_begin($_COOKIE['session'], $_SERVER['HTTP_USER_AGENT'] . "+" . $_SERVER['HTTP_ACCEPT_CHARSET'], $_SERVER['REMOTE_ADDR']); 
else session_begin("", $_SERVER['HTTP_USER_AGENT'] . "+" . $_SERVER['HTTP_ACCEPT_CHARSET'], $_SERVER['REMOTE_ADDR']); 
setcookie("session", session_identity(), 0); 

Und dann nur Ihre eigenen SESSION_ Funktionen rollen:

<?php 

function session_begin($mysession = "", $key = "", $client = "") { 
    global $cfgsession; 
    if (!preg_match("/^[a-z0-9]{32}$/i", $mysession)) $mysession = md5(microtime()); 
    $error = false; 
    $client = trim($client); 
    $key = trim($key); 
    $cfgsession['returning'] = false; 
    if ($chandle = @tmpfile()) { 
    if ($shandle = @fopen($cfgsession['file'], "rb")) { 
     flock($shandle, LOCK_SH); 
     fputs($chandle, $mysession . " " . time() . " $" . $client . " $" . $key . "\n"); 
     while (!feof($shandle)) { 
     $sline = explode(" ", trim(fgets($shandle)), 4); 
     if ($sline[1] >= (time() - $cfgsession['keepalive'])) { 
      if (($sline[0] == $mysession) && ($sline[3] == "$" . $key)) { 
      $cfgsession['client'] = substr($sline[2], 1); 
      $cfgsession['returning'] = true; 
      } elseif (count($sline) > 2) fputs($chandle, implode(" ", $sline) . "\n"); 
     } 
     } 
     fclose($shandle); 
     fseek($chandle, 0); 
     if ($shandle = @fopen($cfgsession['file'], "cb")) { 
     if (flock($shandle, LOCK_EX)) { 
      ftruncate($shandle, 0); 
      $cfgsession['count'] = 0; 
      while (!feof($chandle)) { 
      $cline = trim(fgets($chandle)); 
      fputs($shandle, $cline . "\n"); 
      $cfgsession['count']++; 
      } 
     } else $error = true; 
     fclose($shandle); 
     } else $error = true; 
    } else $error = true; 
    fclose($chandle); 
    } else $error = true; 
    if (($cfgsession['returning'] == false) && ($mysession == $cfgsession['session'])) { 
    $cfgsession['returning'] = true; 
    $mysession = md5(microtime()); 
    } 
    $cfgsession['session'] = $mysession; 

    if ($error) return -1; 
    else return 0; 
} 

function session_count() { 
    global $cfgsession; 
    return $cfgsession['count']; 
} 

function session_client() { 
    global $cfgsession; 
    return $cfgsession['client']; 
} 

function session_id() { 
    global $cfgsession; 
    return $cfgsession['session']; 
} 

function session_index() { 
    global $cfgsession; 
    $index_return = array(); 
    if ($uhandle = @fopen($cfgsession['file'], "rb")) { 
    flock($uhandle, LOCK_SH); 
    while (!feof($uhandle)) { 
     $uline = explode(" ", trim(fgets($uhandle)), 4); 
     foreach ($uline as &$value) { 
     if ($value[0] == "$") $value = substr($value, 1); 
     } 
     if (count($uline) >= 2) $index_return[] = $uline; 
    } 
    fclose($uhandle); 
    } 
    return $index_return; 
} 

function session_returning() { 
    global $cfgsession; 
    return $cfgsession['returning']; 
} 

?> 
Verwandte Themen