15

ユーザーの自動ログイン オプションをチェックしたい。基本的には、Cookie がクライアント側に保存されることを意味します。

問題は、Cookie がスプーフィング/変更されないように安全にするにはどうすればよいかということです。

私の友人の 1 人は、session_id、ユーザーの IP、ブラウザー情報などを格納する db テーブルを用意し、ユーザーが再び Web サイトにアクセスしたときにそのすべての情報を比較することを提案しています。

そのために別のテーブルを用意するのは少し面倒だと思います。それを行う別の方法はありますか?多分トークンか何かで?

4

3 に答える 3

26

この悪名高い Cookie のセキュリティを強化すればするほど、問題が発生します。ユーザーを特に安全にする必要がある場合は、最も面倒な方法を使用する必要があります。

できるだけ安全にしたい場合は、https でのみこの Cookie を受け入れてください。Cookie が http 経由で受け入れられると、スニッフィングされて盗まれる可能性があります。

Cookieにはユーザーデータがまったくないことをお勧めします(あなたが提案したように、トークン)。残念ながら、これには別のテーブルが必要になります。ユーザーがログインして「ログインを維持する」を選択すると、このテーブルにエントリが作成されます。エントリは、無意味な値 ( など) にするmd5(uniqid('', true));ことができます。このトークンは、DB 内で一意であり、ユーザーの ID にマップできます。

ユーザーが Web サイトにアクセスすると、その Cookie の値を確認し、その Cookie が属するユーザーを取得してログインできます。この時点で、古いトークンを破棄して新しいトークンを作成します。「破壊」には多くの意味があります。DB から完全に削除するか、トークンを無効にするフラグを設定できます。クッキーは受け取ったが何らかの理由で認証が通らなかった場合に備えて、同じトークンを複数回使用できるようにしたいかもしれませんが、これは安全ではないと思います。トークンのタイムスタンプを保存し、限られた期間 (たとえば 30 日) の場合にのみ受け入れることもできます。

友人が指摘しているように、ユーザー エージェント、IP アドレスなどの他の情報を保存することもできますが、これらは、同じブラウザーを使用していても (特にモバイルで) 変更される可能性があり、これが原因でユーザーの永続的なログインが受け入れられない場合があります。 、耳障りで不便になる可能性があります。

本当に別のテーブルを作成したくない場合は、Cookie の値からユーザーの ID を取得する方法を保存する必要があります。これは安全性が低くなります。

于 2011-09-29T02:42:23.940 に答える
4

私が知っているほとんどの自動ログインでは、ログインしたセッションを保存する別のテーブルがあります。各自動ログイン セッションにはハッシュ化されたキーが識別子として割り当てられます。このキーは非常に長く、なりすましは事実上不可能です。有効なコードを使用してもクロス 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 文字のランダムに生成された文字列が以前に生成されたものと同じになる可能性はほとんどありません。

于 2011-09-29T02:43:45.083 に答える
-4

以前にこれを行った方法は、実際のパスワードではなく、パスワードの MD5 ハッシュを保存することです。

サーバー側では、ログインが Cookie からのものかどうかを確認し、MD5 を介してハッシュされた後、ハッシュがデータベースのパスワードと同じかどうかを確認する必要があります。

そうすれば、誰かがユーザーのコンピューターをハッキングした場合、パスワードの値を知ることはできませんが、その Cookie を使用してサーバーのみを認証できます。

x 日後に Cookie の有効期限が切れるようにすることで、これをより安全にすることができます。これにより、Cookie が盗まれた場合、泥棒はその期間しかアクセスできなくなります。

結局のところ、最も多くて唯一のことは?安全な方法は、毎回ユーザーをログインさせることです

于 2011-09-29T02:26:55.077 に答える