私が知っているほとんどの自動ログインでは、ログインしたセッションを保存する別のテーブルがあります。各自動ログイン セッションにはハッシュ化されたキーが識別子として割り当てられます。このキーは非常に長く、なりすましは事実上不可能です。有効なコードを使用してもクロス IP でユーザーをログインさせたくない場合は、これを試してください。
function gen_uniqueIdent($length=32){
$alphabet = str_split('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ123456789');
$key = '';
for($loop=0;$loop<$length;$loop++){
$i = mt_rand(0,count($alphabet)-1);
$key.= $alphabet[$i];
}
return $key;
}
ログイン時にこの値をユーザー Cookie に割り当てます。次に、これをデータベースに保存します。
function save_ident($identFromFunctionAbove,$authenticated_user_id){
//hash this with something unique to the user's machine
$hashed = md5($identFromFunctionAbove . $_SERVER['REMOTE_ADDR']);
/** Some actions to remember this hash **/
}
user_id などのユーザー ID に対応するデータベースに保存します。
ユーザー Cookie が検証されると、次のことが簡単にできます。
function validateCookie(){
$ident = $_COOKIE['yourCookieName'];
$hashed = md5($ident . $_SERVER['REMOTE_ADDR']);
/** Check if this hashed value exists in db, if it does, authenticate user **/
}
セッションの有効期限が切れた後、またはユーザーが明示的にログアウトした後も、セッションを削除する必要があります。
もちろん、これは非常に単純で、md5 や ident の衝突は考慮されていません。それでも、2 つの 32 文字のランダムに生成された文字列が以前に生成されたものと同じになる可能性はほとんどありません。