9

以前は、データベースに保存され、ユーザーIDにマップされた一意のハッシュを持つ追加のCookie「rememberme」を作成していました。

ユーザーがそのような Cookie を持っていた場合、ウェブサイトはデータベースでその値を見つけようとしました。見つかった場合は、セッションがセットアップされていました。

その後、新しいプロジェクトを開発して、この一意のハッシュを自分で生成するのはあまり安全ではないのではないかと考えました。1 つの操作 (ユーザー識別) に対して 2 つの Cookie (ネイティブ "PHPSESSID" + my "rememberme") を保持するのはやり過ぎです。

おそらく、グローバルセッションの有効期間ではなく、異なるユーザーセッションに対して個別にセットアップする方法があります...または、ユーザーIDにマップされたデータベースにユーザーセッションを保持する方がよいでしょうか?

更新 1 「私を記憶する」ボタンを作成するのが非常に難しい場合は、別の方法で「コンピューター以外のボタン」を作成できると思いました。アイデアは、php.ini でデフォルトの cookie_lifetime を 1 週間設定することです (たとえば)。ユーザーがこのチェックボックスをオンにすると、session_set_cookie_params 関数を使用して cookie_lifetime をゼロに設定します。

したがって、最初の質問は、session_set_cookie_params が他のユーザーの Cookie に影響を与えるかどうかです (ドキュメントでは、session_set_cookie_params オプションは、php プロセスが実行されるまで有効であると記載されています)。

2 番目の質問は、session_set_cookie_params がグローバル設定に影響を与えていない場合、セッションの再生成は、長寿命の Cookie を保持したくないユーザーに影響しますか?

更新 2: [質問 1 の回答]

session_set_cookie_params 関数をテストしました。session_set_cookie_params を使用してセッション Cookie の有効期間をゼロに設定し、30 秒間実行するスクリプトを作成しました。

if ($_GET['test']) {
  session_set_cookie_params (0);
  while (true) {
    sleep(1);
  }
}
session_start();

そのため、最初のブラウザーで ?test=1 パラメーターを指定してこのスクリプトを開始し、その直後 (このスクリプトの実行中に) 2 番目のブラウザーでパラメーターを指定せずにこのスクリプトを開始しました。答えはノーです。2 番目のブラウザの Cookie は影響を受けませんでした。php.iniで指定された寿命がありました

更新 3: [質問 2 の回答] 次に、再生成が session_set_cookie_params によって設定されたセッション cookie の有効期間に影響するかどうかを確認しようとしました。

はい、影響します。session_set_cookie_params によって設定されたカスタマイズされた有効期間でセッション cookie を設定し、session_regenerate_id() を呼び出すと、cookie には php.ini で設定された有効期間があります。

しかし、session_regenerate_id() を呼び出す前に session_set_cookie_params (0) を設定すると、Cookie の有効期間が正しくなります。

それで、それだけです!それは簡単でした!8)

紳士淑女の皆様、ありがとうございました!

4

2 に答える 2

2

セッションのみを使用してこれを行いたい場合、ユーザーが覚えておきたい場合は、次のことができます。

if((isset($_POST['remember_me']) && $_POST['remember_me']) || ($_COOKIE['remember_me']) && $_COOKIE['remember_me'])) {

  // store these cookies in an other directory to make sure they don't
  // get deleted by the garbage collector when starting a "non-remeber-me"-session
  $remember_me_dir = ini_get('session.save_path') . DS . "remember_me_sessions";

  // create the directory if it doesn't exist
  if (!is_dir($remember_me_dir)) {
    mkdir($remember_me_dir);
  }

  // set the php.ini-directive (temporarily)
  ini_set('session.save_path', $remember_me_dir);

  // define lifetime of the cookie on client side
  $expire_cookie = 60 * 60 * 24 * 30; // in seconds
  session_set_cookie_params($expire_cookie);

  // lifetime of the cookie on server side
  // session file gets deleted after this timespan
  // add a few seconds to make sure the browser deletes
  // the cookie first.
  $garbage_in = $expire_cookie + 600; // in seconds

  // set the php-ini directive for the garbage collector of the session files.
  ini_set('session.gc_maxlifetime', $garbage_in);    
  // send an additional cookie to keep track of the users 
  // which checked the 'remember_me' checkbox
  setcookie('remember_me', 1, time() + $expire_cookie);
}

// now we are ready to start the session
// For all the users which didn't choose to check the 'remember_me' box
// the default settings in php.ini are used.
session_start();

ここでphp.iniは、セッション関連のディレクティブについて詳しく読むことができます

于 2012-10-19T11:11:46.493 に答える
2

「私を覚えている」チェックボックス機能を作るのはとても難しかったので、私は別の方法にたどり着きました.1つのクッキーだけを使用しています.

準備

1) 3 つの入力を含むフォームを用意しました。

  • "login" input [type=text]: ユーザーのログイン
  • "password" 入力 [type=password]: ユーザーのパスワード
  • "not my computer" 入力 [type=checkbox]: 有効期間 = 0 のセッション cookie を使用するように指示します (ブラウザを閉じるときに cookie を削除する必要があります)

2) session.cookie_lifetime = 100500 を設定して、デフォルトで長寿命の Cookie を保持します。

クッキーの設定

したがって、ユーザーがフォームを送信した後、短いセッションを使用することを選択したかどうかを確認します。セッション cookie をユーザーに設定する前に (実際に session_start() を使用する前に)、session_set_cookie_params(0) を呼び出します。

クッキーの再生

次に、セッション Cookie を再生成する必要がある場合は、session_regenerate_id() 関数を使用してこれを簡単に行うこともできます。ただし、この関数はデフォルトで php.ini からセッション Cookie の有効期間を再設定することを覚えておく必要があります。そのため、Cookie を再生成する前に session_set_cookie_params() を呼び出す必要もあります。ところで、カスタム セッション Cookie の有効期間を $_SESSION に保存できます。次のようになります。

// Form handling, session setup
if ($_POST['not-my-computer']) {
   session_set_cookie_params(0);
   session_start();
   $_SESSION['expires'] = 0;
}

// Session regeneration 
if (isset($_SESSION['expires'])) {
    session_set_cookie_params(0);
    session_regenerate_id();
}

この回答の詳細(およびより深い説明)は、質問のテキストに記載されています(テスト中に回答/テスト結果を追加しました)

于 2012-10-21T01:05:29.067 に答える