「ログイン状態を維持する」機能を可能にする安全な php ログイン システムを作成するにはどうすればよいですか?
-
20-09-2019 - |
質問
私は SESSION vars に基づいたシンプルなログイン システムを使用しています。ユーザーがログインすると、スクリプトにユーザーを受け入れるように指示するセッション変数が設定されます。カスタムのクライアント側 Cookie 変数は使用しません。
ログイン画面に「一日中ログインしたままにする」というオプションを提供したいと考えています。それを安全な方法で行うにはどうすればよいでしょうか?
解決
初め:を設定します。 session.cookie_lifetime
ディレクティブ、php.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アドレスをセッションに保存します
- 使用
session_regenerate_id()
ログイン試行が成功するたびに。
他のヒント
「私は一日にログインしておく」、私はあなたがその特定のマシン上で、正しい意味と仮定していますか?あなたは、「ログインの時間」、または、彼らはすべての日にログインし自分自身を維持するために選択した場合、そのログインは無効になりますときのタイムスタンプを覚えているMySQLのテーブルを使用することができます。そして、セッションVARSから、そのユーザーのIDを取得し、あなたのコードの先頭にいくつかのスクリプトを追加します。保存された「最後の有効なTS」に対して、そのユーザの現在のタイムスタンプを比較し、それはその時を過ぎていた場合、あなたは彼らがログアウトする必要があります知っている、あなたがセッションを拭いて再度ログインするようにユーザーを強制、その時点で。この方法は、彼らがしようとすると、その時点の過去に何かをするまで、彼らは実際にログアウトされないことを意味しますが、それは彼らにそれのように見えるだろう。また、かなりのMySQL DBを使用するよりも、あなたも同様にセッション変数にその最後の有効な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']);
}
一つの選択肢は、セッション変数を保存し、IPアドレスと有効期限とそれらを関連付けるMySQLのテーブルを設定するかもしれないが、私はそれが実装される方法についてのすべての詳細がわからないよ。
あなたが探しているものを行うための最も簡単な( にはお勧めしませんが)の方法は、ときあなたのサイトには、その後のチェックれる、コンピューター上のユーザー名とパスワードを使用して$_COOKIE
を設定することです上のユーザーがサインます。
のセキュリティを強化するために、あなたはより良いユーザーのアカウントデータに関する潜在的なハッカー以下の情報を提供するために、ユーザーのデータの塩漬けMD5ハッシュとして一つだけのクッキーを保存するために役立ったことでしょう。あなたはクッキーを設定すると期間を設定することができます。 php.net にそれを行う方法については、合理的に完全なドキュメントを持っています。