まず、誰かがログインしているかどうかを追跡します。その後、「rememberme」機能を処理します。
ログインしている人がいるかどうかを知るには、$_SESSION
アレイを確認するだけです。そこにあるものはすべて、前に置いたからです。したがって、ログインフォームを処理するときに、ユーザー名とパスワードが正しい場合は、ユーザー名、ユーザーIDなどをセッションで保存します($_SESSION['username'] = $username;
)。
ユーザーがページをロードするたびに、チェックするだけです
if (isset($_SESSION['username'])) {
// $_SESSION['username'] is logged in
} else {
// nobody is logged in
}
パスワードをに保存する必要はありません$_SESSION
(実際、セキュリティ上の理由から、データベースにハッシュされている場合を除いて、どこにもパスワードを保存しないことをお勧めします)。
さて、「私を覚えている」機能...まず、いくつかの考慮事項:
- すべてのユーザーがブラウザのCookieを変更できるため、アプリケーションに送信されるCookieが改ざんされていないことを確認する必要があります。
- ユーザーは公共のコンピューター(図書館など)でそれをチェックするかもしれないので、それを無効にするシステムが必要です。
- ユーザーがアプリケーションからログアウトした場合、ユーザーを記憶しているCookieを消去する必要があります。
最初のポイントとして、Cookieに、「記憶」されるユーザーのユーザー名を保存するとします(非常に安全ではありません!!)。つまり、ユーザーがコンテンツ「joe」を使用してWebアプリケーションのCookieを作成した場合、アプリはユーザーjoeがそのコンピューターに記憶されていると見なすため、この攻撃者にjoeであるかのようにアクセスを許可します。したがって、何らかの方法でCookieを暗号化/ハッシュする必要があります。
2つ目のポイントとして、一部のコンピューターで「remember me」を無効にするために、何らかの方法でパスワードを使用します。「rememberme」チェックボックスをオンにした可能性のあるすべてのコンピューターを無効にしたい場合は、パスワードを変更するだけです。これは、パスワードを変更すると、まったく同じ理由で、アカウントに保存されているすべてのログインが無効になることも意味します。しかし、後悔するより安全です...
したがって、ログインを処理し、ユーザー名とパスワードが正しく、「rememeber me」オプションがチェックされている場合、セッションにユーザー名を保存することに加えて、ユーザー名とパスワードのハッシュを保存します( )ユーザーに送信するCookieで。また、どのユーザーがCookieを介して「ログイン」しようとしているのかを知るために、ユーザー名をプレーンテキストで(または元に戻せる方法で暗号化して)Cookieに保存し、Cookieのユーザー名とパスワードのハッシュを次のハッシュで確認する必要があります。データベース内のユーザー名とパスワード。そのチェックが正しければ、ユーザー名をセッションに保存し、このユーザーのCookieをチェックしなくなります(少なくともこのセッションでは)。
したがって、全体として、コードは次のようになります。
login.php
if (check_login($_POST['username'], $_POST['password'])) {
// login correct
$_SESSION['username'] = $_POST['username'];
if (isset($_POST['remember_me'])) {
// we hash the password because we **NEVER** store it in plain text anywhere
// so when we would like to check if the cookie value is correct, we will not
// be able to do so if the hash in the cookie was done from the plaintext
// password.
$value = sprintf('%s:%s', $_POST['username'], md5($_POST['username'].hash_password($_POST['password'])));
setcookie('rememberme', $value);
}
redirect('/your/home/page.php'); // view Post/Redirect/Get design pattern
} else {
// login incorrect, show error message and whatever...
}
すべてのphpファイルの先頭(または、アプリをブートストラップするために含まれているファイル内)
if (isset($_SESSION['username'])) {
// $_SESSION['username'] is logged in, proceed as you wish
} else if (isset($_COOKIE['rememberme'])) {
// this user has checked the remember me feature some time ago in a previous login.
// let's check if it is valid.
list($username, $hash) = explode(':', $_COOKIE['rememberme']);
// we need to get the password hash stored for this user (remember you **NEVER** store passwords in plain text
$pwd_hash = obtain_password_hash_from_username($username);
if ($hash == sprintf('%s:%s', $username, md5($username.$pwd_hash))) {
// yeah, the user remembered is correct. We'll save it to the session to not do this shit again
$_SESSION['username'] = $username;
} else {
// the cookie value is not correct so maybe an attacker is trying to fool us,
// or the user changed his password. Whatever it is, we remove the cookie
// because it's no longer valid
setcookie('rememberme', '', time() - 3600);
}
} else {
// this user is neither logged in nor "remembered"
}
ユーザーパスワードをハッシュする方法はあなた次第です。プレーンなmd5またはsha、塩漬けのmd5またはsha(より良い)、またはブローフィッシュ(推奨)のような時間のかかる方法が好きかもしれません。クッキーをハッシュするために、私はプレーンなmd5を使用しましたが、前に説明した方法のいずれかを選択できます。
それだけだと思います。