9

強制的に SSL にするログイン画面があるので、次のようにします: https://www.foobar.com/login ログイン後、ホームページに移動します: https://www.foobar.com/dashbaord

ただし、(CPU を節約するために) ログインしたら SSL からユーザーを移動したいので、実際にhttps://www.foobar.com/dashbaordにログインしていることを確認した直後に、http://に移動し ます。 www.foobar.com/dashbaord

ページが再度実行されると、(すべてのページがそうであるように) ログインされていることが確認され、セッションが存在しないように見えるため、ログイン画面に移動するためです。

奇妙さ/所見:

  1. リスト項目
  2. 2 回目のログインは常に機能し、幸いにもhttp://www.foobar.com/dashbaordにアクセスできます。
  3. 最初のログインで Cookie が正常に作成されます
  4. 2回ログインしてからログアウトし、再度ログインすると、2回のログインは必要ありません(Cookieが存在するという事実にこれをたどったようです)。Cookie を削除すると、2 回のログインに戻ります。
  5. 2 回目のログイン後、ssl から非 ssl に移動でき、セッションは持続します。
  6. 最初のログイン時に、非 SSL サイトに移動するとセッションが完全に消去され、手動で SSL サイトに戻ると、再度ログインする必要があります。
  7. 最初のログインとまったく同じメカニズムを使用した 2 回目のログイン (ssl 経由)

私が試したこと:

  1. security.level と session.checkagent の Cake の設定をいじる - 何もない
  2. Cake でセッションを db に保存する (ファイル システムではなく) - 何もない
  3. XP マシン上の FF、IE、Chrome でのテスト。

これは、作成されているが読み取られていないCookieに関連しているように感じます。

環境: 1. Debian 2. Apache 2 3. Mysql 4 4. PHP 5 5. CakePHP 6. セッションは PHP のデフォルトでファイルとして保存されます

4

7 に答える 7

4

私はこれを理解しました。Cake は、session.cookie_secure ini 値をオンザフライで SSL 接続中に自動的に切り替えていました。そのため、作成される Cookie は安全な Cookie であり、2 番目のページでは認識されませんでした。

解決策として、/cake/lib/session.php の 420 行目をコメントアウトします。

ini_set('session.cookie_secure', 1);

(リリースが公開されると行番号が変わると確信しているので、それを検索して見つけてください。)

于 2008-12-08T17:21:21.537 に答える
4

受け入れられた回答は、「ログインしたらSSLから人々を移動させたい」というOPの希望を満たしていますが、ユーザーセッションをハイジャックにさらすという点で非常に安全ではありません(簡単な悪用についてはFiresheepを参照してください)。

CakePHP のデフォルトの動作 (ユーザーが SSL 経由で認証された後、すべてのページを SSL で提供する必要があります) と受け入れられた回答 (すべての認証済みページを暗号化せずに提供し、認証済みの Cookie を公開する) の間のより良い妥協点は、SSL で暗号化されたページを提供することです。認証が必要な場合のみ。

これを実現する簡単な方法は、2 つのセッション Cookie を維持することです。1 つはセキュアに提供され、認証情報を保持し、もう 1 つは非セキュアに提供されます。このようなデュアルセッション アプローチをサポートする単純な実装では、次のように session_handler を使用して session.name をオーバーライドします。

    if (env('HTTPS')) {
        ini_set('session.name', Configure::read('Session.cookie').'-SECURE');
    }else{
        ini_set('session.name', Configure::read('Session.cookie'));
    } 

このアプローチで留意すべき点の 1 つは、非 SSL ページから認証が必要なページに直接リンクするには、https を使用して明示的にリンクする必要があることです。これは、認証情報を含むセッション Cookie を送信し、ブラウザは、リンクが暗号化されている場合にのみそうします。

于 2010-11-21T17:56:05.487 に答える
3

まず、2 回目のログインが最初のログインとまったく同じメカニズム (HTTPS 経由) を使用していることを正しく理解していますか?

セキュリティで保護されていないページに最初にアクセスすると、ログイン時に作成されたセッションに加えて、新しいセッションが作成されますか?

最初のログイン時に、Cookie にSecureフラグが設定されていないかどうかを確認します (つまり、Cookie は安全な (HTTPS) 接続を介してのみ送信されます)。

于 2008-11-21T12:58:20.187 に答える
1

(CakePHPライブラリファイルを編集するのではなく)構成ファイルで独自のセッション処理設定を指定できます。構成ファイルでは、session.cookie_secureを0に設定できます。これは、/ Cake / lib/sessionの設定よりも優先されます。 php。これにより、セッションCookieをSSL接続と非SSL接続の両方に使用できるようになります。

このトピックに関するブログエントリは次のとおりです。http: //bakery.cakephp.org/articles/view/how-to-bend-cakephp-s-session-handling-to-your-needs

およびクックブックからのいくつかのドキュメント:http: //book.cakephp.org/view/173/Sessions

于 2010-02-05T18:35:21.353 に答える
1

詳細については、CakePHP のドキュメント ( http://book.cakephp.org/2.0/en/development/sessions.html ) を参照してください。アプリケーションが SSL プロトコル上にある場合、CakePHP のデフォルトは session.cookie_secure を true に設定します。アプリケーションが SSL プロトコルと非 SSL プロトコルの両方からサービスを提供する場合、セッションが失われるという問題が発生する可能性があります。SSL ドメインと非 SSL ドメインの両方でセッションにアクセスする必要がある場合は、これを無効にする必要があります。

ファイル Config/core.php を開き、次のように追加します。

Configure::write('Session', array(
    'defaults' => 'php',
    'ini' => array(
        'session.cookie_secure' => false
    )
));

これで、セッションを失わない http と https を切り替えることができます :)

于 2013-08-15T15:55:18.713 に答える
0

この問題にぶつかったばかりで、私は次のようにコメントしました、そしてそれはうまくいきました:

<br />ini_set('session.name', Configure::read('Session.cookie'));
<br />
from session.php (/cake/lib/session.php, line 480~)
于 2010-01-28T09:25:52.220 に答える
0

あなたのホームページには、サーバーに後続のリクエストを行うフラッシュがありますか? それとも、コンテンツの Ajax 読み込みですか?

サーバーから送信されるヘッダーを確認しましたか? IE では Fiddler を使用でき、Firefox では Live Headers アドオンを使用できます。新しい Cookie が設定されていないか、CAKEPHP Cookie の値が異なるかどうかを確認します。

于 2008-11-21T14:10:55.033 に答える