5

複数のリクエスト間でログインを維持するために通常Webアプリが従うプロセスと、COOKIESを使用して物事を管理する方法について知りたいです。

ログインフォームで「RememberMe」機能を提供しています。

ユーザーがログインすると、データベースからユーザー名とパスワードの有効性を確認します。有効な場合は「Rememberme」が選択されているかどうかを確認し、有効な場合はユーザー名とパスワードを暗号化された形式でセッションに保存します。そして最後にユーザー名とパスワードをSESSIONに保存します。

ユーザーが1つのページから別のページに移動するとき、最初にログインチェックスクリプトを実行します。このスクリプトはCookieに値があるかどうかをチェックし、次にデータベースからそのユーザー名とパスワードを検証して、その有効性をチェックします。cookieに値がなく、sessionに値がある場合は、セッション値をフェッチしており、dbからチェックしていません。

不必要にdbにヒットしないように、dbからのセッション値をチェックしていません。処理を高速化します。クッキーの場合は変更可能ですので、確認が必要です。

これが私のコンセプトですよね?それは行く方法であり、通常はWebサイトのようなSOであり、他の方法でこの種の方法を使用していますか?

または、Webサイトは、セッション中またはCookie内に関係なく、ページの読み込みごとにログインの信頼性をチェックしますか?

このシナリオについての考えや概念を確認してください。

ありがとう!

4

1 に答える 1

14

まず、誰かがログインしているかどうかを追跡します。その後、「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を使用しましたが、前に説明した方法のいずれかを選択できます。

それだけだと思います。

于 2011-02-23T19:44:31.127 に答える