web-dev-qa-db-ja.com

安全に自動ログインを実装する方法

私は、「パスワードを間違って保存している可能性がある」という投稿について、多くのmany投稿を読みました。それらは常に、ユーザーがログインしているサーバーにパスワードを保存することを指します。彼らは基本的にパスワードをソルトするなどのユビキタスなアドバイスをリハッシュします(しかし、意図的に)。しかし、クライアントにパスワードを保存するためのベストプラクティスに関する記事を見たことはありませんクライアントがログインするたびに手動でログインする必要がないようにします。 「記憶」機能。

ブラウザからDropboxなどのプログラムまで、多くのソフトウェアにこの機能があります。

私は読んだ 古い記事 最近、DropboxがコンピューターにIDをどのように保存していたかについて、別のコンピューターにコピー/貼り付けしてDropboxを起動し、IDを取得したデバイスとしてログインできるようにした。ログインなし、何もない、Dropboxアカウントへのフルアクセス。これは本当にばかげたデザインのようですが、私にはそれを行うためのこれ以上の方法は考えられません。

プレーンテキストでCookieのようなものを保存するのを避ける方法すらわかりません。暗号化する場合、暗号化を解除するための鍵はどこに保存しますか?

セキュリティの脆弱性を導入しないと私が思う唯一の方法は、自動ログイン機能を削除して、ユーザーがサービスを使用するたびにパスワードを入力するようにすることですが、それはユーザビリティの苦労であり、ユーザーはそうする必要がないことを期待して甘やかされています。

自動ログイン機能を実装するために資格情報をローカルに安全に保存することについて、何を読むことができますか?記事全体に対して原則が単純すぎる場合、それらは何ですか?問題のソフトウェアは、一部のLinuxディストリビューションにある「キーチェーン」のように、すべてのプラットフォームに存在しない機能に依存するべきではありません。

16
Jay Simon

1つの方法は次のとおりです。

  • ユーザーがログインしたら、セッションIDをクライアントのコンピューターのCookieに保存します(ユーザー名やパスワードではありません)。
  • セッションをIPアドレスに関連付けるため、個々のセッションIDは、それが起動されたコンピューターでのみ機能します。

サイトの開発に使用しているフレームワークによっては、この動作が組み込み機能として利用できる場合があります。

いずれにしてもHTTPプロトコルはステートレスであるため、Webサイトを使用する1つのセッション中に誰かがログインし続けることと、次にサイトを使用するときに「自動ログイン」することの間に機能上の違いはありません。セッションの有効期限が切れるまでの時間の問題です。

pdate:また、明らかに、セキュリティを強化するためにHTTPSを使用します。

pdate 2:このアプローチには制限があり、IPアドレスを頻繁に変更するユーザーにはうまく機能しないことに注意してください。ただし、セキュリティレベルが向上し、状況によっては役立つ場合があります。

12
user82096

Amazon(および他の多く)はハイブリッドアプローチを使用しています。閲覧、カートへのアイテムの追加、および以前に使用したクレジットカード/配送先住所の組み合わせを使用した注文のための自動ログインを提供します。ただし、クレジットカードの追加、配送先住所の追加/変更、パスワードの更新、過去の注文の表示(オプション)、その他の多くのアカウント設定など、多くのアクションでパスワードを入力する必要があります。

そう、そうです、あなたのコンピュータにアクセスする人はあなたのセッションを乗っ取ることができますが、あなたはまだ彼らが注文したものを手に入れます! (さらに重要なことに、セッションをハイジャックするインセンティブはほとんど無効になります。)しかし、誰かが私のコンピューターにアクセスできる場合、平均的なサイトセッションを盗むよりも大きな問題があります。

セキュリティがそれほど必要でないアプリケーションの部分がある場合は、セッションID(ハッシュまたは必要に応じて何でも)を保存するハイブリッドモデルを選択して、ユーザーをサイトのセキュリティの低い部分に自動ログインできます。 、ただし、セキュリティレベルが高い領域に入るときにパスワードを入力し、セッションが終了するときにセキュリティが高いトークンを削除するように要求します。

もちろん、これが銀行レベルのサイトであれば、自動ログインはオプションではありません。繰り返しになりますが、これらのタイプのセキュリティを使用するサイトは、保護しているデータの価値を想定しており、ユーザーにとっての追加の利便性は、ハイジャックされたセッションの潜在的なリスクよりも重要です。アプリケーションに当てはまらない場合は、自動ログインを実装しないでください。ユースケースに適したセキュリティ/ユーザビリティのトレードオフのレベルにアクセスする必要があります。

5
Eric G

実際、それほど難しくはありません。最初に、次の形式でCookieを保存します。

userID.token

トークンにはsha1ハッシュを使用できます。次に、remember_me_tokensデータベーステーブルストアのユーザーID、トークンのbcryptハッシュ、およびトークンが生成された時刻。

次に、誰かがサイトにアクセスしたときに、Cookieが設定されているかどうかを確認します。 Cookieが設定されている場合は、過去7日以内にデータベースにCookieの有効な行があるかどうかを確認してください。データベースにCookieの有効な行がある場合、ユーザーがログインしていることを示すようにセッションを設定し、一致したCookie /データベース行を削除して、新しいCookie /トークン/データベース行を生成します。

ログアウトした場合は、Cookieを削除してください。

Cronジョブを実行して、7日以上経過したremember_me_tokensをプルーニングします。

2
Ryan

保存できるデバイスが信頼できる場合にのみ可能です。それがどれほど安全であるかは、ユーザー次第です(デバイスに影響を与えることができない場合)。それは単にあなたの手の外にあります。

コメントで述べたように:

それはあなたが信頼するものについてです。マシンストアIDを信頼しない場合は、それが問題です。キーチェーンを信頼している場合、それがあなたが得る最大のセキュリティです。もちろん、デバイスハードウェアの検出などのカスタムの安全機能を追加することもできますが、すべて偽造できるため、結局はわかりません。それはあなたのコントロールの外です。

0
Luc Franken