2009-03-04 8 views
10

私は統合しようとしている2つのアプリケーションがあります。 1つは私によって書かれ、もう1つは私が使用しているCMSです。私の認証はコード化されたもので起こり、私はCMSにその情報を知らせたい。問題は、CMSが1つのセッション名を使用し、私のアプリケーションが別のセッション名を使用することです。私は可能な名前空間の競合のために同じものを使用させたくありませんが、私はまだこの情報を取得したいと思います。セッションでPHPセッションを切り替えることはできますか?

要求の途中でセッション名を切り替えることはできますか?たとえば、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(); 

この作品は次のようなものですか?このようなことがsession_start()が呼び出された後にうまくいくなら、私はドキュメントやウェブ上で何も見つけることができません。ヒント?

私は、この情報を入手するためにWebサービスを開発することを検討していましたが、明らかにセッションから取得することは、その情報が既に利用可能であるため望ましいでしょう。

ありがとうございます!

答えて

0

session_idを使用する必要があります。セッションID(または名前)を設定/取得するために使用できます。

したがって、擬似コードでsession_nameを使用する代わりに、session_idを使用します。

1

session_regenerate _id()

マニュアルはかなりよく、これを説明するが、ここでのセッションの名前空間マニュアル

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

これは良い賭けのように見えます...私はそれを行こう! –

+3

-1:これはセッションIDのみを変更しますが、セッションはまだ同じです。 – hakre

0

Zend_Session申し出からいくつかの例です。

Zend_Session_Namespaceのインスタンスは、名前空間のスライス$ _SESSIONの ため アクセサ・オブジェクトです。 Zend_Sessionの コンポーネントは、既存の投与とPHP EXT /セッションと 管理インターフェイスをラップ、ならびに は、セッション名前空間を持続する でZend_Session_NamespaceためのAPIを提供します。 Zend_Session_Namespaceは、 標準化されたオブジェクト指向の インターフェイスを提供します。 は、PHPの標準 セッションメカニズム内に継承されています。 の匿名および認証済みの両方のセッションネームスペースのサポートが存在します( (「login」など)。

0

可能です。しかし、自分で処理するセッションを行う必要があると思います。

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

// … 

しかし、他のセッションでもクッキー設定などの処理を行う場合があります。この場合でもPHPがこれを行うかどうかはわかりません。

3

注:以下の回答は正しくありません。使用しないで投票してください。私はここで議論の場として残しました

session_name()への呼び出しの前に前のセッションを手動で閉じる必要があることを除けば、ソリューションは動作するはずです。黙って失敗する。 PHPはすべてのことの世話をする - セッションID値と実際に混乱する必要はPHPセッションID操作ルーチン経由または手動クッキーマングリングのいずれかを介して、ありません

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; 

あなたはこのような何かを試すことができますそれ自体を混乱させるべきではありません。

ここ
+1

私は同じIDを持つ2つの異なるセッション名で終わることができます。その場合、名前が異なる場合でも、両方のセッションが同じデータを共有します。それを避けるために、あなたはすべての後にセッションIDを混乱させたいかもしれません... – commonpike

+1

2つの異なるクライアントが同じセッションIDを "間違って"得るかもしれないと仮定しない限り、それがどうなるかはわかりません。これは、session_name()が動作する方法は、PHPがセッションを識別するために使用するクッキーを変更し、新しいセッションを生成する(既存のセッションをロードするのではなく)場合、PHPは新しいセッションID - そうでなければ、セッションをハイジャックするのは簡単です。 – Guss

+0

また、セッションIDを混乱させることは、セッションハイジャッカーのための穴を開ける確実な方法です。セッションIDを混乱させる場合(しないでください)、セッションIDを生成する方法を知っておらず、常に 'session_regenerate_id()'を使用してください。 – Guss

6

は、セッション間で切り替える方法を実施例である:あなたが見ることができるように、セッションを変更しながら、セッション変数を保存、復元、そう


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

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

ログは次のようになります。

+3

セッションIDを手動で混乱させないでください。これは、あるユーザーを他のユーザーと区別するためのものです。セッションIDを手動で操作すると、セッションハイジャックが発生する可能性があります。これは、初期化されていない場合は、** bad **です。 – Guss

+0

session_idを手動で設定するのではなく、 'session_regenerate_id()'を呼び出すことができます(ただし、2回目の 'session_start()'の後に行う必要があります)。この変更を行い、あなたのコードから 'session_id()'の両方の呼び出しを取り除くと、セッションIDを使いこなすことなく同じ効果が得られます。これは古いセッションを読み込まないことに注意してください。「第2のセッション」にあるすべてのデータは最初のセッションと同じです。新しいデータが古いセッションに書き込まれないようにするだけです。交換可能なセッションを管理するための独自のメカニズムを構築するのは始まりのようです。 – Guss

2

私はこれを完成させるために取り組んできました。ここで私が思いついたのはこれです。私は、私の子アプリケーションでセッション名を使用して親セッションに切り替え、次に私の子アプリケーションのセッションに戻ります。このソリューションは、親セッションが存在しない場合は作成します。

$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

これは私のために働いた!元のセッションに戻すことは重要です。そうしないと、最後の魔法のセッション処理コードが実行され、状況が変わってしまいます。 –

関連する問題