3

ログインページに、個人のコンピューターにCookieを記録する機能をコーディングすることに興味がremember meあります。これには危険があることを知っているので、これを正しい方法で行うようにしたいです。

検証のためにデータベーステーブルとCookie自体の間にリンクを作成する人々について聞いたことがあります。ただし、これを行う方法や、推奨されているかどうかはわかりません。私はクッキーを初めて使用するので、可能な限り最善の方法を説明してください。私が言ったように、私はこれまでこれをコーディングしたことがないので、例はありません。正しい方法でそれを実行し、それを実行した人々からの意見を確実に得たいと思っています。

FacebookのCookieが永久に続くかどうかはわかりません。自分のコンピューターで、履歴を削除しない限り、実際にログインし直す必要がないことを知っています。だから私はおそらく彼らがそれをするのと同じようにそれをしたいと思います。

前もって感謝します!

4

3 に答える 3

3

私がこれまでに見た永続的なCookieの最良のテクニックの1つは、BarryJaspanのです。

  1. ユーザーがRememberMeをオンにして正常にログインすると、標準のセッション管理Cookieに加えてログインCookieが発行されます。
  2. ログインCookieには、ユーザーのユーザー名、シリーズID、およびトークンが含まれています。系列とトークンは、適切に大きなスペースからの推測できない乱数です​​。3つすべてがデータベーステーブルに一緒に保存されます。
  3. ログインしていないユーザーがサイトにアクセスしてログインCookieを提示すると、ユーザー名、シリーズ、およびトークンがデータベースで検索されます。
    1. トリプレットが存在する場合、ユーザーは認証されたと見なされます。使用されたトークンはデータベースから削除されます。新しいトークンが生成され、ユーザー名と同じシリーズIDでデータベースに保存され、3つすべてを含む新しいログインCookieがユーザーに発行されます。
    2. ユーザー名とシリーズが存在するがトークンが一致しない場合、盗難が想定されます。ユーザーは強い言葉で警告を受け取り、ユーザーが記憶しているセッションはすべて削除されます。
    3. ユーザー名とシリーズが存在しない場合、ログインCookieは無視されます。

記事全体を読むことをお勧めします。上記が要点です。

さらに、SSL接続を介してのみこれらのCookieを発行し、それにフラグを設定するsecure必要httponlyがあります。

これは、ユーザーがSSL経由でサーバーに接続しているときにのみ認証されることを意味するため、Strict-Transport-SecurityHTTPヘッダーを追加して、ブラウザーが将来常にSSLを使用するように強制し、さらにpersistent_login_available=yes非SSL接続のような単純なCookieを設定します。ブラウザが非SSL接続を介してサイトにアクセスし、サーバーがpersistent_login_availableCookieを確認した場合、ブラウザは訪問者をSSLバージョンにリダイレクトし、安全なCookieを介してユーザーを認証します。

このプロセスを使用すると、可能な限り安全になります。それはあなたのニーズには少し上回っているかもしれませんが、あなたは決めます。

于 2013-03-16T21:04:18.660 に答える
3

私はまだこれを自分でコーディングしていませんが、次のように問題に取り組みます。

1.ユーザーが永続性のために Cookie を提示するときに有効性チェックを強制するために使用できるテーブルを作成します。

create table RememberMe
(
   user_id    int(10)  NOT NULL,
   user_token char(10)  NOT NULL,
   token_salt int(6)   NOT NULL,
   time       int(10)  NOT NULL,
   PRIMARY KEY (user_id),
   CONSTRAINT nameYourConstraint 
              FOREIGN KEY (user_id) 
              REFERENCES userTableName (whatever_user_id_equals)
)

このテーブルに入力するには、ログインに数行のコードを追加します。この例では、疑似コードを使用します

// userID variable has been sanitized already so
// check if user clicked remember me
// and if the user logged in successfully:
if ( rememberMe == checked && login() == true )
{
     // random number to serve as our key:
     randomNumber = random( 99, 999999  );

     // convert number to hexadecimal form:
     token = toHex( ( randomNumber**randomNumber ) );

     // encrypt our token using SHA1 and the randomNumber as salt
     key = encrypt( token, randomNumber, SHA1 );

     // get the number of seconds since unix epoch:
     // (this will be 10 digits long until approx 2030)
     timeNow = unix_time()

     // check to see if user is in table already:
     sql = "SELECT user_id FROM RememberMe
            WHERE user_id = 'userID'";

     // connect to database:
     db = new DBCon();
     
     result = db->query( sql );
     
         // number of rows will always be 1 if user is in table:
         if ( result->rows != 1 )
             exists = true;
         else 
             exists = false;
     
     result->free_memory();
     
         if ( exists == true )
         {
             sql = "UPDATE RememberMe SET
                    user_id    = 'userID'
                    user_token = 'token'
                    token_salt = 'randomNumber'
                    time       = 'timeNow'";
         }
         else
         {
             sql = "INSERT INTO RememberMe
                    VALUES( 'userID', 'token', 'randomNumber', 'timeNow' )";
         }
     
     result = db->query( sql );
     
         // the affected rows will always be 1 on success
         if ( result->affected_rows != 1 )
         {
            print( "A problem occurred.\nPlease log in again." );
            quit();
         }

     result->free_memory();

     // create a new cookie named cookiemonster and store the key in it:
     // (we're not actually storing a score or birthday, its a false flag)
     set_cookie( "CookieMonster", escape("score="+ userID +"birthday="+ key );
}

このコードが行うことは、ユーザーがremember meをチェックしたかどうかを確認し、データベーステーブルにキー、トークン、およびユーザーのソルトと時刻を入力します(これにより、remember meに時間制限を適用できます)特徴)。

ここから、 CookieMonster Cookie が設定されているかどうかを確認するコードを Web サイトに追加できます。設定されている場合は、次の手順に従って有効性を強制できます。

  1. 提示された Cookie からユーザー ID とキーを抽出する

  2. userID を使用してデータベースにクエリを実行し、

       --> a) user has requested to be remembered
    
       --> b) check the time to see if they cookie is still valid
    
       --> c) extract the token and salt from database table record
    
  3. encrypt() 関数呼び出しを通じてトークンとソルトを実行し、提示されたキーと照合します。

  4. すべてがチェックアウトされたら、新しいセッションを作成し、ユーザーをログインさせます。

ユーザーがサイトにアクセスするたびにログインし、コンピューターが侵害された場合、攻撃者はパスワードにアクセスできなくなります。

補足: パスワードや電子メールを変更するときは、常にユーザーにパスワードの提示を要求する必要があります。これにより、ユーザーの Cookie が悪用された場合に、攻撃者がアカウントを盗むことができなくなります。

于 2013-03-16T22:46:54.773 に答える
2

この戦略はベストプラクティスと見なされます。次の記事をご覧ください:http://jaspan.com/improved_persistent_login_cookie_best_practice

于 2013-03-16T21:03:07.200 に答える