5

SESSION変数に基づく単純なログインシステムを使用しています。ユーザーがログインすると、ユーザーが受け入れられるようにスクリプトに指示するセッション変数が設定されます。カスタムのクライアント側Cookie変数は使用しません。

ログイン画面に「一日中ログインしてください」というオプションを提供したいと思います。安全な方法でそれをどのように行うのですか?

4

3 に答える 3

14

最初に: session.cookie_lifetimephp.ini、設定ファイル、または を介し​​て、ディレクティブを設定しますsession_set_cookie_params()

次に、ユーザー名とパスワードのハッシュ値をセッションに保存し、すべてのページでそのログインを検証します。それがまだ有効である限り、彼らはログインしたままになります.

セッション cookie の自然な有効期限は、セッションの途中でログアウトされる人がいないため (もちろん、星がそれに合わせて調整されている場合)、セッション cookie をアクティブにしておくと、通常は物事が整理された状態に保たれます。ただし、それができない場合は、if ステートメントに 2 行目を追加するだけでよいので、eCartoth のソリューションは僅差であると考えます。

if (my_validate_user_function($_SESSION['username'],$_SESSION['passhash']) 
    && $_SESSION['deathstamp'] > time()
) {
    // user is logged in again, oh boy!
}
else {
    // send in the death robots
    header('Location: /login.php',true,302);
}

編集: 考慮すべきことの 1 つは、セッション固定および/またはセッション ハイジャックです。それを防ぐために、次の 2 つの解決策のいずれか (または両方) をお勧めします。

  1. ユーザーの IP アドレスをセッションに保存する
  2. session_regenerate_id()ログイン試行が成功するたびに使用します。
于 2009-12-18T17:28:08.147 に答える
3

「一日中ログインし続けてください」と言うとき、その特定のマシンでのみという意味だと思いますよね?mysql テーブルを使用して、「ログイン時刻」、または一日中ログインし続けることを選択した場合にそのログインが無効になるタイムスタンプを記憶できます。次に、セッション変数からそのユーザーの ID を取得するスクリプトをコードの先頭に追加します。そのユーザーの現在のタイムスタンプを保存されている「最後の有効な ts」と比較し、その時間を過ぎている場合は、ログアウトする必要があることがわかります。その時点でセッションをワイプし、ユーザーに再度ログインを強制します。この方法は、その時点を過ぎて何かをしようとするまで実際にはログアウトされないことを意味しますが、そのように見えます。また、

たとえば、ユーザーが最初に「一日中ログインしたままにする」を選択してログインした場合:

$_SESSION['log_me_out_at'] = strtotime(date("Y-m-d ")."23:59:59");

次に、システムでページがアクセスされるたびに:

if( $_SESSION['log_me_out_at'] < time() ){
  unset($_SESSION['user_is_accepted_in']);
}
于 2009-12-18T17:05:16.053 に答える
2

1 つのオプションは、セッション変数を保存し、それらを IP アドレスと有効期限に関連付ける MySQL テーブルをセットアップすることですが、それがどのように実装されるかについての詳細はすべてわかりません。

探していることを行うための最も簡単な (推奨されませ$_COOKIEが) 方法は、コンピューターにユーザー名とパスワードを設定することです。これにより、ユーザーがサインオンするときにサイトがチェックします。

セキュリティを強化するために、ユーザーのアカウント データに関する潜在的なハッカーの情報を少なくするために、ユーザー データのソルト付き MD5 ハッシュとして Cookie を 1 つだけ保存することをお勧めします。期間は、Cookie を設定するときに設定できます。php.netには、その方法に関するかなり完全なドキュメントがあります。

于 2009-12-18T16:45:01.807 に答える