2012-06-22 36 views
7

Trên trang web của chúng tôi, chúng tôi muốn chia sẻ các phiên có nhiều tên miền. Tất cả các trang web này đều nằm trên cùng một máy chủ nhưng một số trang web có một địa chỉ IP khác.Cách tạo ID phiên duy nhất trong php

Các giải pháp khả thi tôi thấy được để thiết lập các session ID bản thân mình:

<?php 
session_id($someUniqueHash); 
?> 

Và làm việc này, nếu tôi làm cho băm như md5 ('test'). Trên một tên miền khác trên cùng một máy chủ, chúng tôi có phiên họp một lần nữa.

Sự cố đang tạo ID. Tôi thấy một số giải pháp trên internet với microtime vv, nhưng khi tôi sử dụng phương pháp đó tôi không thể dự đoán ID phiên trên tên miền khác/trang PHP.

Có ai có ý tưởng không? Hay chúng ta không nên thực hiện điều này? Có các tùy chọn khác để chia sẻ phiên trên nhiều tên miền không? (KHÔNG phải tên miền phụ!)

+1

Tại sao bạn không để PHP tạo ID phiên cho bạn? Bạn có thể chia sẻ ID phiên trên các tên miền BTW. Đó là một vấn đề của cookie * hoặc * truyền tham số truy vấn. – hakre

+0

Thông số truy vấn không được ưu tiên, nó không an toàn và không thân thiện với url. Theo như tôi biết bạn chỉ cho phép cookie accros cùng một tên miền (tên miền phụ cũng) không multidomains. –

+0

Nó chỉ là một cookie bạn vượt qua. Và bạn có thể tạo cookie cho tên miền của bên thứ ba, được gọi là cookie của bên thứ ba. Bạn cũng có thể cần phải kiểm tra mặt pháp lý để thực hiện việc này (bên cạnh khía cạnh kỹ thuật được giải quyết). Btw tất cả các chi tiết kỹ thuật bạn có thể muốn tìm hiểu về: [Cơ chế quản lý nhà nước HTTP RFC6265] (http://tools.ietf.org/html/rfc6265) – hakre

Trả lời

4

tôi đã đạt được hệ thống này bằng cách sử dụng một dòng chảy OAuth loại nhưng chúng tôi thay thế người tiêu dùng với người dùng.

Vì vậy, mỗi miền sẽ có Access_Token được xác thực trong phiên của riêng nó. Sau đó, bạn sẽ sử dụng Access_Token đó để nhận thông tin về người dùng từ api.

Tôi cũng giải quyết vấn đề phiên sử dụng session_set_save_handler và lưu các phiên trong bảng cơ sở dữ liệu ... Bảng này cũng sẽ có Access_Token, giúp dễ dàng tìm phiên bằng truy vấn DB.

Hy vọng điều này sẽ giúp với ý tưởng.

+0

Tôi đã nghĩ đến việc này gần đây. Tôi tự hỏi nếu có bất kỳ nghiên cứu điển hình hoặc thảo luận đơn giản về hiệu suất lưu trữ và truy xuất bằng cách thêm mã thông báo truy cập vào bảng db và truy vấn nó theo mọi yêu cầu. –

0

Hmm đây là một điều khó khăn.

Vì mọi người đều biết PHP sử dụng cookie để hiểu session_ids khi người dùng quay lại trang web của bạn và không có cách nào để cookie tên miền chéo: Cross domain cookies (chỉnh sửa: nhưng phương pháp phức tạp).

Đây có lẽ là lý do tại sao tôi chưa bao giờ thấy trang web triển khai điều này mặc dù chúng có các miền khác nhau.

Bạn có thể, thông qua liên kết trên trang của bạn từ một tên miền chuyển id phiên tới tên miền tiếp theo thông qua $ _GET hoặc $ _POST. Điều này sẽ không hoạt động nếu người dùng trực tiếp vào trang web khác của bạn.

Phương pháp duy nhất một phần (không đáng tin cậy) tôi có thể đưa ra là lưu giữ hồ sơ của người dùng comptuer trong DB và sử dụng nó để hiểu phiên được đính kèm vào. Vì vậy, bạn nhà máy tính địa chỉ IP và có thể một số chi tiết khác và đó sao lưu vào một phiên.

IP và các chi tiết khác của máy tính cá nhân sẽ đăng nhập chúng vào miền khác.

+0

Tnx. Có một trang web làm điều đó: http://www.laptopshop.nl chẳng hạn. Tôi biết trang web của họ được phát triển bằng PHP, vì vậy nó có thể. Nhưng tôi sợ là khó. –

+0

Tôi làm đúng câu trả lời của tôi qua cookie miền là có thể nhưng vững chắc như được đề cập trong bài đó, nhưng yea qua các phiên miền thực sự không đáng tin cậy ... – Sammaye

0

Có thể đây không phải là một lựa chọn cho bạn, nhưng bạn có thể thử điều này.

Trên trang web chính của bạn, bạn tạo id phiên như bình thường và để duy trì phiên tới một tên miền khác, bạn có thể bao gồm thẻ hình ảnh có id phiên trong URL. Đáp lại, tên miền khác sẽ thiết lập một cookie, để khi khách truy cập đến đó, nó sẽ biết id phiên.

Cảm thấy một giải pháp thông minh, nhưng nó sẽ hoạt động nếu bạn không có quá nhiều tên miền khác :) cookie của bên thứ ba có thể được tắt riêng trong trình duyệt btw, điều cần xem xét.

Oh btw, việc chấp nhận phiên (chấp nhận id thông qua tham số truy vấn và đặt cookie) là nội dung tinh tế và cần được bảo vệ, tức là phiên phải đã tồn tại trước khi đặt cookie.

0

Configure mỗi trang web cá nhân:

<?php 

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

?> 

Để làm phiên nhiều trang web chia sẻ, hãy để họ sử dụng cùng một $cfgsession['file']. Bao gồm phiên từ một trang web trong một yêu cầu đến một tên miền khác (có thể do Jack đề xuất) và miễn là bạn không bắt họ yêu cầu trong trình duyệt khác hoặc bất kỳ điều gì (vui lòng một số nội dung để ngăn chặn việc chiếm đoạt phiên) , hãy để họ chỉ định phiên có $ _GET. Ví dụ:

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); 

Và sau đó chỉ cần cuộn chức năng session_ riêng bạn:

<?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']; 
} 

?> 
Các vấn đề liên quan