2009-08-28 12 views
9

私はfoo.comを実行します。 foo.comには2つの異なるアプリケーションがあります:1つはfoo.com/barで、もう1つはfoo.com/exampleです。私はセッションを使ってログイン中のユーザーに関する情報を追跡しますが、ユーザーがfoo.com/barからfoo.com/exampleに行くと、foo.com/exampleはユーザーがfoo.com/から開始したセッションを表示しますその情報を使用します。私の質問は、どのように私は同時に2つの異なるセッションが各ディレクトリに行くことができますか?同じドメインに2つの異なるセッションがある

+0

django poweredプロジェクトで同じ機能を実現するにはどうすればいいですか? – Dania

答えて

2

また、同じセッションを使用しますが、あなたが探して変数名を変更することができます。

編集:申し訳ありませんが、これはあなたの質問に答えることはできませんが、別の解決方法を示します。

+0

これは最善の解決策であるようです。ありがとう。 – Matthew

+0

Thanks Matthewありがとうございました。あなたの質問に答えるならば覚えておいてください。それを 'The Answer'としてマークすることを覚えておいてください:) – user103219

+0

投票された答えのほうが良いです - 最も良い方法は 'session_name'です。 – joryl

1

session_set_cookie_paramsを使用して、セッションのドメインとフォルダを保存することができます。 IE:

// Used on foo.com/example 
session_set_cookie_params(86400, '/example'); 

// Used on foo.com/bar 
session_set_cookie_params(86400, '/bar'); 
+0

これは動作していません。私はそれを前に(そしてもう一度)試してみましたが、成功しませんでした。私のグローバルphp.ini設定と関係しているかもしれません。 – Matthew

+0

末尾のバックスラッシュをパスに追加するには、 が必要です。それがなければ、それは確かに動作しません。 –

+0

php.iniにアクセスできる場合は、 'session.cookie_path'パラメータを直接設定することができます。これは、この関数がオーバーライドするはずのものです。また、php.iniファイルにアクセスできない場合は、ini_set()を使用することもできます。 –

0

もう1つの解決策は、foo.com/barのすべてのセッション値を "bar_"とfoo.com/exampleと "example_"で事前に保留することで、セッション内に名前空間を効果的に作成することです。

これを退屈なものにする方法は、この機能を関数またはクラスメソッドに抽象化することです。例:

function set_session_value($key, $value) { 

    //figure out which prefix to use by checking the current working 
    //directory, or whatever method you like. set $prefix equal to 
    // "bar_" or "example_". 

    $_SESSION[$prefix . $key] = $value; 
} 

次に、一致する関数で値を取得します。

これの主な利点は、/ barでプログラミングしているときにどの変数名を/ exampleで使用しているか考える必要がないことです。もう1つは、セッション値の格納方法を変更する場合は、すべてを1か所で簡単に変更できるということです。

41

session_startを呼び出す前にsession_nameに電話する必要があります。これは、セッションを識別するために使用されるクッキーの名前を設定します(デフォルトでは、これはPHPSESSIDです)。

アプリケーションごとに異なる名前を使用してください。セッション内の変数を混乱させる必要はありません。

+6

+1:これは本当にアプリケーションセッションを別々に保つ最良の方法です。 – Powerlord

+1

それらを別々に保つ最高の解決策。 +1を与える – eHussain

0

私はこれが古いことを認識しますが、誰かを助けるかもしれないと考えました。この例では、管理領域のセッションを個別に設定する方法を示しています。

if ($_SERVER['REQUEST_URI'] == '/admin/'): 
    $session_name = 'session1'; 
else: 
    $session_name = 'session2'; 
endif; 
session_start($session_name); 
4

これまで提供されているソリューションに関連する潜在的なセキュリティの影響を強調することは非常に重要だと思います。 私は約5年間Webアプリケーションの侵入テストを受けていて、今度はITセキュリティから始まるジュニアの訓練を支援するために、脆弱なセキュリティアプリケーションを多数開発しました。

私はちょうど提供されたソリューションをテストしており、どれも近隣のアプリケーションに属するセッションへのアクセスを妨げないことに気付いています。 session_name()で異なるセッション識別子名を使用しても、ユーザーはこれらの識別子の値を使用できません。 PHPには、セッション識別子の名前ごとに分離された記憶域がありません。私は、異なるセッション名を使用し、ブラウザのクッキーパスを設定する2つのアプリケーションを持っていました。以下の各のSet-Cookieディレクティブは、HTTPレスポンスに含まれていた:

Set-Cookie: TESTONE=<value one>; path=/testone/ 

Set-Cookie: TESTTWO=<value two>; path=/testtwo/ 

両方のアプリは完全に別のユーザーを持っていたし、誰かが唯一、彼らは/testone/アプリはに応じて上の情報にアクセスすることができるかもしれ/testtwo/アプリへのアクセスを持っていた場合セッションパラメータの処理方法。以下のコード例は、両方のアプリが認証成功後に$_SESSION["authenticated"]パラメータを使用すると仮定した場合のデータ侵害の可能性を示しています。この$topsecretinfo 1にアクセスするには

<?php 
    session_name("TESTONE"); 
    ini_set("session.cookie_path","/testone/"); 
    session_start(); 
    if ($_SESSION["authenticated"] == "yes") 
     echo $topsecretinfo; 
?> 

は、/testtwo/アプリケーションで認証彼らTESTTWOセッション識別子の値を取り、/testone/アプリケーションに要求を送信するときにTESTONEセッション識別子の値としてそれを使用する必要があります。 PHPのセッション検索プロセスは、対応する値を解析する以外はセッション識別子の名前を認識しません。すなわち、「agcy648dja6syd8f93」のセッション識別子値は、それを参照するために使用された名前にかかわらず、同じセッションオブジェクトを返す。

関連する問題