web-dev-qa-db-ja.com

Webアプリケーション認証/セキュリティのベストプラクティス(すべてのプラットフォーム)

今日、上司から質問がありました。特に、一般的なユーザー名のパスワードログインフィールドで「パスワードを記憶」する多くの人気のあるブラウザーの性質に関して、Webフォームアプリケーションの認証の許容可能な設計とは何であるかについて私の考えを尋ねました。

許容できると思う答えを出すのに苦労しています。ソニーの恥ずかしいセキュリティ上の欠陥に照らして、人々に保存されているデータの感度は低くても、私は本当に注意したい。社会保障番号や住所は保存していませんが、電話番号、メールアドレス、訪問者の写真は保存しています。

彼は、ユーザーがパブリックターミナルでパスワードを記憶するだけで、誰かがこのターミナルにジャンプして、不正な方法でデータの表示または変更を開始できることを懸念しています。ただし、少なくともWindowsワークステーションでは、ブラウザーがWindowsユーザーアカウント間で「パスワードを記憶」しないことは、かなり確実です。

これを超えて、サーバー側で一方向のパスワード暗号化を実装しています(暗号化されたパスワードをデータベースに保存し、サーバーでユーザー提供のパスワードを暗号化し、データベースの暗号化された文字列と比較します)。 SSL暗号化を組み込む計画は今のところありませんが、これはオプションです。

このアプローチに重大なセキュリティ上の欠陥はありますか?より良い提案はありますか?

12
maple_shaft

高レベルのヒント:

  1. 必要なデータのみを保存
  2. 機密データ(SSN、パスワード、クレジットカード番号など)を保存するときは常に暗号化する
  3. 機密データの送受信時に常にSSLを使用してトラフィックを暗号化する
  4. 情報の機密性が疑わしい場合は、暗号化する
  5. ユーザー入力を信頼しない(誰かが何か悪いものを入力しようとする)
  6. データを信頼しないでください(誰かがデータベースでデータを変更する可能性があります-悪意のあるスクリプトを挿入するなど)
  7. 独自の暗号化を行わないでください
  8. アプリケーション/データベースをホストしているサーバーを保護する
  9. セキュリティのためにエンドユーザーの負担を増やします(パスワード制限、決してパスワードを公開しない、電子メールでURLを送信しない、セッション時間を短縮するなど)。

あなたへの私の提案は、Webアプリケーションのセキュリティ保護に関する本を入手することです。 1つの回答/ブログ/記事で伝えるには情報が多すぎます。暗号化のトピックだけでも重要です。

13
Mayo

ブラウザの動作をオーバーライドすることを試みることができます-ここでいくつかの良いアドバイス:

https://stackoverflow.com/questions/32369/disable-browser-save-password-functionality

2
Chad Thompson

大丈夫だと思う。

ほとんどのユーザーは、自分のパスワードをパブリックターミナルに保存しない程度に明るくなり、パスワードはプロファイルごとに保存されます。付箋に簡単に書いたり、弱いパスワードを使用したりする可能性があることを覚えておいてください。

ログインページがSSLを介して暗号化されていない場合、攻撃者がパスワードをネットワーク上を移動する際にそのパスワードを盗聴することはそれほど難しくありません。ただし、データベース内のパスワードをハッシュ化することで、攻撃者が全員のパスワードを見るのを防ぐことができます(ユーザーが使用している他のサイトにログインするために電子メールアドレスを使用する可能性があります)。

それでもやりたい場合は、チャドが指摘したように、ブラウザの動作を無効にする方法があります。私は自分の銀行のWebサイトとMicrosoftのLiveシステムでしかこれを見たことがありません。

1
David Hogue

特定の時点では、ユーザーを自分自身から保護することはできません(法的に義務付けられていません)。 「パスワードを記憶する」機能は危険な場合がありますが、ユーザーが想定する危険です。同様に、ユーザーが複数のサービスでパスワードを再利用することを決定した場合、ユーザーはそのリスクも想定します。ユーザーが頻繁にパスワードをメモしている場合でも、付箋にパスワードを書き留めてモニターに貼り付けないように警告する必要もありません。

つまり、誰かが訴訟を起こし、ルールを変更するまでです。 「警告:内容が熱くなっている可能性があります」も参照してください。

1
Rein Henrichs

ブラウザがパスワードを記憶するかどうかを確実に制御できるとは思いません。ブラウザがそれを行うかどうかに関わらず、それはあなたの手に負えません。 あなたにとって必ずしも大きなセキュリティリスクでもありません。攻撃は有効なログインから行われる可能性があると常に想定する必要があります。誰かが有効なログインユーザー/パスを持っているので、彼らは駄目になるとは思わないでください。結局のところ、パスワードが悪意のある人物に渡る可能性はたくさんあります。

あなたができることは、ログインフォームのフィールド名を毎回ランダム化することだと思います。 <input name="username"の代わりに、<input name="user658667587"などを使用してください。それはキャッシュされたユーザー名をかなり役に立たなくするでしょう。しかし、オーバーヘッドがそれだけの価値があるかどうかはわかりません。言うまでもなく不便パブリックマシンでarentを使用しているユーザー。

セキュリティが非常に重要な状況(銀行、投資など)の場合は、ログオン時に他の人にパブリックマシンかどうかを尋ねるだけです。ログイン時に既知のIPアドレスをキャッシュすることもできます。また、別の場所からログインする場合は、通常のユーザー/パスに加えて、入力できないPIN番号(画像をクリックするなど)が必要です。私の銀行はそれに似たことをしています。

0
GrandmasterB