2009-03-04 18 views
10

Tôi có hai ứng dụng mà tôi đang cố gắng hợp nhất. Một được viết bởi tôi và một là một CMS tôi đang sử dụng. Xác thực của tôi xảy ra trong tài khoản tôi đã mã hóa và tôi muốn CMS của mình biết thông tin đó. Vấn đề là CMS sử dụng một tên phiên và ứng dụng của tôi sử dụng tên phiên khác. Tôi không muốn làm cho họ sử dụng cùng một do xung đột không gian tên có thể nhưng tôi vẫn muốn nhận được thông tin này.Bạn có thể chuyển đổi phiên PHP trong một phiên không?

Có thể chuyển đổi tên phiên ở giữa yêu cầu không? Ví dụ: thực hiện một việc như thế này trong CMS:

//session_start already called by cms by here 

$oldSession = session_name(); 
session_name("SESSION_NAME_OF_MY_APP"); 
session_start(); 

//get values needed 
session_name($oldSession); 
session_start(); 

Điều gì đó tương tự như vậy? Tôi không thể tìm thấy bất cứ điều gì trong các tài liệu hoặc trên web nếu một cái gì đó như thế này sẽ làm việc sau khi session_start() đã được gọi. Lời khuyên?

Baring giải pháp này, tôi đã xem xét việc phát triển một dịch vụ web để có được thông tin, nhưng rõ ràng là chỉ nhận được nó từ phiên sẽ thích hợp hơn vì thông tin đó đã có sẵn.

Cảm ơn!

Trả lời

0

Bạn nên sử dụng session_id, bạn có thể sử dụng nó để đặt/nhận id phiên (hoặc tên).

Vì vậy, thay vì sử dụng session_name (trong mã giả của bạn), hãy sử dụng session_id.

1

session_regenerate _id()

Tài liệu hướng dẫn giải thích điều này khá tốt nhưng đây là một số ví dụ từ cuốn hướng dẫn

session_start(); 

$old_sessionid = session_id(); 

session_regenerate_id(); 

$new_sessionid = session_id(); 

echo "Old Session: $old_sessionid<br />"; 
echo "New Session: $new_sessionid<br />"; 

print_r($_SESSION); 
+0

điều này có vẻ giống như đặt cược tốt ... Tôi sẽ cung cấp cho nó một đi! –

+3

-1: Điều này chỉ thay đổi id phiên, nhưng phiên vẫn như cũ. – hakre

0

Zend_Session cung cấp không gian tên cho các phiên.

trường Zend_Session_Namespace là đối tượng accessor cho lát namespaced của $ _SESSION. Thành phần Zend_Session kết thúc phần mở rộng/phiên hiện tại của PHP hiện hành với giao diện quản trị và cũng như cung cấp API cho Zend_Session_Namespace để tồn tại không gian tên phiên. Zend_Session_Namespace cung cấp một giao diện tiêu chuẩn hóa, hướng đối tượng để làm việc với các không gian tên được duy trì bên trong cơ chế phiên bản tiêu chuẩn của PHP . Hỗ trợ tồn tại cho cả ẩn danh và được xác thực (ví dụ: "không gian đăng nhập").

0

Có thể. Nhưng tôi nghĩ bạn phải làm phiên xử lý chính mình:

session_name('foo'); 
// start first session 
session_start(); 

// … 

// close first session 
session_write_close(); 

session_name('bar'); 
// obtain session id for the second session 
if (ini_get('session.use_cookies') && isset($_COOKIE[session_name()])) { 
    session_id($_COOKIE[session_naem()]); 
} else if (ini_get('session.use_trans_sid') && !ini_get('session.use_only_cookies') && isset($_REQUEST[session_name()])) { 
    session_id($_REQUEST[session_naem()]); 
} 
// start second session 
session_start(); 

// … 

Nhưng lưu ý rằng bạn cũng có thể thực hiện một số phiên xử lý khác như cài đặt cookie. Tôi cũng không biết liệu PHP có thực hiện điều này trong trường hợp này hay không.

3

Lưu ý: câu trả lời bên dưới không chính xác, vui lòng không sử dụng hoặc bỏ phiếu.Tôi đã để nó ở đây như một nơi để thảo luận

Giải pháp của bạn sẽ hoạt động (không phải là tôi đã từng thử điều gì đó như vậy), ngoại trừ việc bạn phải đóng phiên trước đó trước khi có bất kỳ cuộc gọi nào đến số session_name() âm thầm thất bại.

Bạn có thể thử một cái gì đó như thế này:

session_write_close(); 
$oldsession = session_name("MY_OTHER_APP_SESSION"); 
session_start(); 

$varIneed = $_SESSION['var-I-need']; 
session_write_close(); 
session_name($oldsession); 
session_start; 

Không cần phải thực sự gây rối với các giá trị session ID, hoặc thông qua thói quen thao tác PHP session ID hoặc thông qua thủ Cookie mangling - PHP sẽ chăm sóc tất cả những gì chính nó và bạn không nên gây rối với điều đó.

+1

Dường như với tôi, bạn có thể kết thúc với hai tên phiên khác nhau có cùng id. Nếu điều đó xảy ra, cả hai phiên sẽ chia sẻ cùng một dữ liệu, ngay cả khi chúng có tên khác nhau. Để tránh điều đó, bạn có thể muốn lộn xộn với id phiên sau tất cả ... – commonpike

+1

Tôi không thấy điều đó có thể xảy ra như thế nào - trừ khi bạn giả định rằng hai khách hàng khác nhau cũng có thể nhận cùng một ID phiên "do nhầm lẫn". Điều này là do cách session_name() hoạt động là nó thay đổi cookie PHP sử dụng để xác định phiên, và nếu điều đó khiến bạn tạo phiên mới (thay vì tải một phiên hiện có), PHP sẽ đảm bảo rằng nó đang sử dụng một phiên bản mới ID phiên - nếu không sẽ dễ dàng chiếm đoạt phiên. – Guss

+0

Ngoài ra, rối tung xung quanh với ID phiên là một cách chắc chắn để mở lỗ cho các phiên không tặc. Nếu bạn làm lộn xộn xung quanh với ID phiên (xin vui lòng không), không giả sử bạn biết cách tạo ID phiên và luôn sử dụng 'session_regenerate_id()'. – Guss

6

Dưới đây là một ví dụ làm việc làm thế nào để chuyển đổi giữa các phiên:

session_id('my1session'); 
session_start(); 
echo ini_get('session.name').'<br>'; 
echo '------------------------<br>'; 
$_SESSION['value'] = 'Hello world!'; 
echo session_id().'<br>'; 
echo $_SESSION['value'].'<br>'; 
session_write_close(); 
session_id('my2session'); 
session_start(); 
$_SESSION['value'] = 'Buy world!'; 
echo '------------------------<br>'; 
echo session_id().'<br>'; 
echo $_SESSION['value'].'<br>'; 
session_write_close(); 
session_id('my1session'); 
session_start(); 
echo '------------------------<br>'; 
echo $_SESSION['value']; 

Log sẽ trông giống như:


PHPSESSID 
------------------------ 
my1session 
Hello world! 
------------------------ 
my2session 
Buy world! 
------------------------ 
Hello world!

Vì vậy, như bạn có thể thấy, các biến session lưu và khôi phục khi thay đổi phiên.

+3

Vui lòng không gây rối với ID phiên bằng tay - đây là điều phân biệt người dùng này với người dùng khác. Nếu bạn thao tác các ID phiên bằng tay, bạn cho phép xảy ra tình trạng tấn công phiên, và điều đó - đối với người không được khởi tạo - là ** xấu **. – Guss

+0

Thay vì đặt session_id theo cách thủ công, bạn có thể gọi 'session_regenerate_id()' (nhưng bạn phải làm điều đó sau 'session_start()' thứ hai). Thực hiện thay đổi này và xóa cả hai lệnh 'session_id()' khỏi mã của bạn, bạn sẽ có được hiệu ứng tương tự mà không gây rối với id phiên.Lưu ý rằng điều này không tải phiên cũ - tất cả dữ liệu có trong "phiên thứ hai" giống hệt với phiên đầu tiên - nó chỉ đơn giản ngăn không cho dữ liệu mới được ghi vào phiên cũ. Nó trông giống như một khởi đầu để xây dựng cơ chế của riêng bạn để quản lý các phiên trao đổi. – Guss

2

Tôi đã làm việc để hoàn thiện điều này và đây là những gì tôi đã đưa ra. Tôi chuyển sang phiên phụ huynh bằng cách sử dụng tên phiên trong ứng dụng con của tôi và sau đó quay lại phiên của ứng dụng con tôi. Giải pháp tạo ra phiên cha mẹ nếu nó không tồn tại.

$current_session_id = session_id(); 
$current_session_name = session_name(); 

session_write_close(); 

$parent_session_name = 'NameOfParentSession'; 

// Does parent session exist? 
if (isset($_COOKIE[$parent_session_name])) { 

    session_id($_COOKIE[$parent_session_name]); 
    session_name($parent_session_name); 
    session_start(); 

} else { 
    session_name($parent_session_name); 
    session_start(); 

    $success = session_regenerate_id(true); 
} 

$parent_session_id = session_id(); 

// Do some stuff with the parent $_SESSION 

// Switch back to app's session 
session_write_close(); 
session_id($current_session_id); 
session_name($current_session_name); 
session_start(); 
+0

Điều này làm việc cho tôi! Thay đổi trở lại phiên ban đầu là quan trọng bởi vì nếu không ma thuật phiên xử lý mã ở cuối sẽ được chạy và mọi thứ trở nên kỳ lạ! –

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