ユーザーIDとハッシュであるCookie(7日間の有効期限)で2つの変数を使用しています。ハッシュは、ユーザー エージェントとユーザー ID の sha1 エンコードです。この場合、盗まれた Cookie のブラウザを知っているハッカーがログインできます。セキュリティの問題を記憶するには、どの方法に従うべきか、またはどのプラクティスが最適ですか?
5 に答える
user_idとsecret_keyをハッシュすることはできますが、このCookieを傍受した人は誰でもアプリケーションにログインできます。これに加えて、あなたの覚えているクッキーがすぐに古くなるようにすることができます。古いクッキーが好きな人はいません。
各ユーザーの最後の訪問のタイムスタンプをデータベースとCookieに保存できます。Cookieを読み取ってユーザーをログインさせるたびに、両方のタイムスタンプが一致することを確認します。そうでない場合は、ユーザーを拒否します。含まれている場合は、タイムスタンプを更新します。
この方法を使用すると、ユーザーがサイトに戻るたびに、すべての古いCookieが古くなります。Cookieを傍受したハッカーは、現在の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に保存する必要があります。覚えておいてくださいCookieは完全に安全ではないため、機密性の高いデータやアプリケーション機能にさらにアクセスするには、パスワードの再入力が必要です。
また、Cookieに「remember_me」以外の名前を付けて、見つけにくくすることをお勧めします。セキュリティはそれほど向上しませんが、Cookieに「ht33424」という名前を付けるには、「remember_me」または「hack_me」という名前を付けるのと同じくらいの時間がかかります。
有効期限を現在の日付に加えて Cookie に 1 年を設定するだけで、Amazon が使用する実装と同様に、すべての機密領域にパスワード入力フィールドを設定できます。ハイジャックされた Cookie はアクセスを許可しますが、個人的なものを購入または変更するには、パスワードを再入力する必要があります。
「remember me」テーブルの問題は、ハッカーがこのテーブルにアクセスできる場合、必要な数のアカウントを作成してログインできることです。これにより、リメンバーミー機能のセキュリティが強化されると主張することもできますが、セキュリティの膝の部分を柔らかくするリスクを考慮に入れる必要があります.
個人的には、ランダムハッシュを作成し、それを「rememberme」テーブルに保存します。このテーブルには、ユーザーエージェント、ユーザーID、およびIPアドレスも含まれています。私はremember-me関数からユーザーに再ログインするたびに両方をチェックします。また、ユーザーが手動でログアウトした場合は、その行をテーブルから削除するだけです。その後、再度ログインすると、新しいランダムハッシュが作成されます。(HTTPSのみのフラグが設定された安全なCookieを使用しない限り)remembermeシステムで誰かがパケットをスニッフィングするのに対抗する方法は実際にはありません。したがって、HTTPSのみのCookieを使用した安全な接続を使用してください。できない場合は、少なくともハッシュをランダムにして、発見された場合は、少なくともそのログインを強制終了するための新しいハッシュを生成できます...
HMAC
私は通常このようにするので、データベースなどのサーバー側に保存するものは何もありません。
「秘密鍵」となるランダムな文字列を生成する必要があり、サーバー側に保存する必要があり(おそらく、定数としてconfig phpスクリプトに格納する必要があります)、誰にも通知する必要はありません。これを秘密鍵と呼びますSECRET_KEY
。
次に、Cookieは2つの値を設定する必要があります。
USER_ID
:自動ログインを取得するユーザーのユーザーIDHASH
USER_ID
:との安全な暗号化ハッシュSECRET_KEY
。したがって、たとえば、md5(USER_ID . "-" . SECRET_KEY)
。(sha1やsha256などのmd5とは異なるものが推奨されます)。
したがって、最終的なCookieは次のようになりますUSER_ID:HASH
。
次に、Cookieが本物のremember me Cookieであるかどうかを確認する必要がある場合は、次のようにする必要があります。
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
最終的には、セッションを使用してユーザー ステータスを保存できます。ただし、セッションを長時間保持すると、セッション ID が盗まれるときに同じ問題が発生します。Cookie 情報をブラウザや IP アドレスなどの他のものと結合できますが、ユーザーが静的 IP を持っていない場合、問題が発生します。
とにかく、セッションIDを保持する方が、ユーザーのsha1エンドドパスワードをCookieに入れるだけで安全です.