覚えている私の機能[重複]のためのベストプラクティス
-
30-09-2019 - |
質問
この質問にはすでに答えがあります:
ユーザーIDとハッシュであるCookie(7日の有効期限)の2つの変数を使用しています。ハッシュは、ユーザーエージェントとユーザーIDのSHA1エンコードです。この場合、盗まれたクッキーのブラウザを知っているハッカーがログインできます。どちらに従うべきか、どの方法でセキュリティの問題を覚えておくのに最適ですか?
解決
User_idとSecret_keyをハッシュできますが、このCookieをインターセプトする人なら誰でもアプリケーションにログインできます。これに加えて、あなたが私を覚えている私のクッキーが非常に速く古くなるようにすることができます。古いクッキーが好きな人はいません。
各ユーザーの最後の訪問のタイムスタンプをデータベースとCookieに保存できます。クッキーを読んでユーザーをログインするたびに、両方のタイムスタンプが一致することを確認します。そうでない場合は、ユーザーを拒否します。もしそうなら、タイムスタンプを更新します。
この方法を使用して、ユーザーがサイトに戻るたびに、すべての古いCookieが古くなります。クッキーを傍受したハッカーは、現在のクッキーの正確なタイムスタンプを知らないため、価値のない古いクッキーを持っています。もちろん、ハッカーは、ユーザーが戻ってログインするまで、必要なだけ新鮮なクッキーを使用できます。
//check for cookie
if(isset($_COOKIE['remember_me'])) {
// get hash and time stamp from cookie
$hash = substr($_COOKIE['remember_me'],0,40);
$last_visit = substr($_COOKIE['remember_me'],41);
// query your db with $hash and $last_visit
// if hash and time stamp match up
// log in
// store the current time stamp in a variable to use for both
$time = date("Y-m-d H:i:s");
// update the time stamp in your cookie
$cookie = $pass . "-" . $time;
setcookie('remember_me', $cookie, time()+60*60*24*100, '/');
// update the time_stamp in your database
else {
// remove the remember me cookie
setcookie('remember_me', '', time()-42000, '/')
}
この方法は少量のセキュリティを提供し、他の回答で提案されているサイドメソッドに沿って確実に使用する必要があります。ハッシュされたキーをCookieに保存する必要があります。覚えている私は完全に安全ではないので、非常に機密のデータまたはアプリケーション機能への追加アクセスには、パスワードの再入力が必要です。
また、「Remember_me」以外にクッキーに名前を付けることをお勧めします。それはあまりセキュリティを追加しませんが、もしあれば、あなたのCookie「HT33424」に名前を付けるには、「remember_me」または「hack_me」という名前と同じ時間がかかります。
他のヒント
有効期限をCookieで1年以上にわたってsimlplyに設定できますが、Amazonが使用する実装と同様に、あらゆる機密領域にEnterパスワードフィールドを使用できます。ハイジャックされたCookieはアクセスを許可しますが、個人的なものを購入または変更するには、パスワードを再入力する必要があります。
「Remember Me」テーブルの問題は、ハッカーがこのテーブルにアクセスできる場合、彼が必要なだけ多くのアカウントにログインできるということです。覚えている私の機能のセキュリティを強化すると主張することができますが、セキュリティの膝領域を柔らかくするリスクと比較検討する必要があります。
個人的には、ランダムなハッシュを作成し、「Remember Me」テーブルに保存します。テーブルには、ユーザーエージェント、ユーザーID、IPアドレスもあります。 Remember-Me関数からユーザーを再ログインするたびにチェックします。そして、ユーザーが手動でログアウトする場合、テーブルからその行を削除するだけです。次に、再度ログインすると、新しいランダムハッシュが作成されます。 Remember Meシステムで誰かがパケットをスニッフィングするパケットと戦う方法は本当にありません(HTTPSのみのフラグセットでセキュアCookieを使用しない限り)。したがって、HTTPSのみのCookieとの安全な接続を使用してください。できない場合は、少なくともハッシュをランダムにするので、それが発見された場合、少なくともそのログインを殺すために新しいハッシュを生成できます...
最終的にセッションを使用してユーザーステータスを保存できます。しかし、セッションを長く保持することは、セッションIDが盗まれると同じ問題を引き起こします。ブラウザやIPアドレスなど、他のいくつかの他のものとCookieの情報に参加できますが、ユーザーが静的IPを持っていない場合に問題が発生します。
とにかく、セッションIDを保持することは、ユーザーのSHA1をCookieにエンドロードしたパスワードを入れるだけで、より安全です。
hmac
私は通常このようにしているので、データベースなどにサーバー側に保存するものは何もありません。
「シークレットキー」になり、サーバー側に保存する必要があるランダムな文字列を生成する必要があります(おそらく定数として構成のPHPスクリプトに)、誰にも伝える必要はありません。この秘密の鍵と呼びます SECRET_KEY
.
その後、クッキーは2つの値を設定する必要があります。
USER_ID
: :自動ログインを取得するユーザーのユーザーIDHASH
: :安全な暗号化ハッシュUSER_ID
とSECRET_KEY
. 。たとえば、md5(USER_ID . "-" . SECRET_KEY)
. 。 (SHA1やSHA256など、MD5とは異なるものが推奨されます)。
したがって、最終的なクッキーは次のとおりです。 USER_ID:HASH
.
次に、クッキーが本物のクッキーを覚えているかどうかを確認する必要があるとき、あなたはそうする必要があります:
function isCookieGenuine($cookie_value) {
list($value, $hash) = explode(':', $cookie_value, 2);
if (md5($value . "-" . SECRET_KEY) == $hash)
return true;
else
return false;
}
ポイントは、ハッシュが必要なだけでなく、このチェックに合格するハッシュを生成できるということです。 USER_ID
しかし、 SECRET_KEY
それは不明です サーバー以外の人によって! :)
コメントに記載されているように、あなたはこれを使用することでこれを行うことができます hash_hmac
php> = 5.1.2の関数: http://us.php.net/manual/en/function.hash-hmac.php