web-dev-qa-db-ja.com

Cookieにパスワードを保存することは安全ですか?

私のWebアプリケーションのホームページにはRememberMeチェックボックスがあります。ユーザーがそれをチェックした場合、メールIDとパスワードをCookieに保存します。これは私のコードです:

if (this.ChkRememberme != null && this.ChkRememberme.Checked == true)
   {
     HttpCookie cookie = new HttpCookie(TxtUserName.Text, TxtPassword.Text);
     cookie.Expires.AddYears(1);
     Response.Cookies.Add(cookie);
   }

私が知りたいのは:

  • Cookieにパスワードを保存することは安全ですか?
  • 同じことをする適切な方法は何ですか?
  • Cookieの時間を設定する際のベストプラクティスは何ですか?
58
ACP

パスワードはプレーンテキストとして利用できるため、Cookieにパスワードを保存することは安全ではありません。

Cookieに関するいくつかの回答を見つけるのに適した場所は Cookie Central。 です。メンバーシップでは、通常、ユーザー名とパスワードを指定したときにWebサイトから発行される「トークン」と呼ばれる長い文字列を持つCookieが使用されます。あなたはこれで見つけることができるプロセスの詳細 記事 。 ASP.NETでフォーム認証を使用する場合、次のように認証Cookieを設定できます。

FormsAuthentication.SetAuthCookie(userName, isPersistanceCookie);

2番目のパラメーターは「Remember Me」機能に使用されます-trueの場合、サイトを離れた後も持続する永続的なCookieが作成されます。次のように、プログラムでCookieを操作することもできます。

HttpCookie authCookie =
  HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];

番号! Cookieにパスワードを保存しないでください!

ASP.NETでは、使用

FormsAuthentication.SetAuthCookie(username, true);

2番目の引数の値は、Cookieが永続的であるかどうかを決定します(remember meチェックボックスの値)。

25
stepanian

いいえ、リモートでは安全ではありません。 Cookieがプレーンテキストで保存されないという保証はありません(実際、ほとんどの実装doは、Cookieをプレーンテキストとして保存します)。

Cookieを傍受したユーザーはアプリケーションにアクセスできるため、「私を記憶する」ことは本質的に安全ではありません。しかし、ユーザーのパスワードを公開することで、安全性をさらに高めることができます。 :-)そして、もし彼らが見つけたら、おそらくユーザーを本当に怒らせます。

暗号化されたCookie文字列を使用します。これには、サーバー上のテーブルを除き、ユーザーのアカウントに関連付けられた(他の)方法ではないトークンと組み合わせたユーザーのアカウント名が組み込まれます。ユーザーがサイトに戻ったら、Cookieを復号化し、そのトークンが実際にそのアカウントに関連付けられているかどうかを調べます。トークン(およびCookie)はすべての自動ログインを変更し、その自動ログインに使用されたものを無効にします。 (複数の場所から自動ログインできるように、トークンとアカウントの間には多対1の関係があります。必要に応じて制限できます。)トークンがX日以内に使用されない場合、トークンはタイムアウトします。 (これは、Cookieの期間を制限するだけでなく、サーバー側でも実行されます。)bitCookieをデコード(復号化に成功)するか、盗まれたCookieを使用(復号化は不要)するのは困難ですが、やり過ぎには意味がありません(繰り返しますが、 "remember me"は本質的に安全でない)。

堅牢なセキュリティが本当に必要ではないサイトで(明らかに)それを使用し、多数の動的IPクライアントがあるため、IPにロックダウンしようとはしません。しかし、IPにロックダウンしても安全ではありません。攻撃対象を少し減らすだけです。

なぜクッキーにユーザー名があるのか​​疑問に思うかもしれません。単に「覚えておいてください」という目的のために、暗号化されていても(結局、ユーザー名+パスワードシステムの認証ペアの半分)、そこに置くことはお勧めしません。この質問に対してこれをどのように行ったかを思い出したときに、フォーマットを見て、Cookieでそれを見つけて少し驚きました。しかし、私はそれがなぜあるのかを説明するコメントを見ました、そして、「私を覚えている」とは無関係の理由があります(必ずしも永続的理由、後知恵ではなく、理由) 。

最後に、「remember me」は本質的に安全ではないという事実は、サイトログが非常に重要な理由の1つであり、重要なアカウント情報の変更を許可するプロセスでパスワードの再確認が必要な理由の1つです( Cookieを盗んでアカウントの所有権を取得した人)。

15
T.J. Crowder

Cookieの値を変更してサーバーに送り返すのは非常に簡単なので、これは絶対にすべきではありません。 「ユーザーは「ナイーブ主義者」としてログインしている」とcookieに保存するのは間違っています。「ユーザーは「Pandiya Chendur」としてログインしています」に変更できるからです。

Cookieでできることは、たとえ変更されてもサーバーにとって意味のない情報をクライアントに提供することです。たとえば、お気に入りの色、最初のページのレイアウトなど。

Cookieに保存されているセッションIDを与えることができます。なぜなら、他のセッションから有効なセッションIDを知っている場合を除き、値を他の値に変更すると、自分自身で何も改善できないからです。

MicrosoftのMSDN Cookieの使用に関する説明

Cookieのセキュリティ問題は、クライアントからデータを取得する問題と似ています。アプリケーションでは、Cookieはユーザー入力の別の形式であるため、調査およびなりすましの対象となります。 Cookieはユーザー自身のコンピューターで使用できるため、ユーザーは少なくとも、Cookieに保存したデータを表示できます。ユーザーは、ブラウザが送信する前にCookieを変更することもできます。

ユーザー名、パスワード、クレジットカード番号などの機密データをCookieに保存しないでください。 Cookieには、ユーザーや何らかの方法でCookieを盗む可能性のあるユーザーの手に渡らないものを入れないでください。

同様に、Cookieから取得する情報についても疑ってください。データが書き出したときと同じであると想定しないでください。ユーザーがWebページに入力したデータで使用するのと同じCookie値を使用して、セーフガードを使用します。このトピックの前の例では、ユーザーから取得した情報を表示する前と同様に、ページに値を表示する前にCookieのコンテンツをHTMLエンコードする方法を示しました。

Cookieはブラウザとサーバー間でプレーンテキストとして送信され、Webトラフィックを傍受できる人は誰でもCookieを読み取ることができます。接続でSecure Sockets Layer(SSL)が使用されている場合にのみ、Cookieが送信されるようにするCookieプロパティを設定できます。 SSLは、ユーザーのコンピューター上にある間、Cookieが読み取られたり操作されたりすることを保護しませんが、Cookieは暗号化されるため、転送中にCookieが読み取られることはありません。詳細については、「Webアプリケーションの基本的なセキュリティプラクティス」を参照してください。

10
naivists

ところで、ストアパスワードは、クライアント側とサーバー側の両方で安全ではありません。

あなたはそれをする必要はありません。

2
Nikkau

パスワードをプレーンテキストとして利用できるため、Cookieにパスワードを保存することは安全ではありません。しかし、優先基準がそうすることである場合、またはユーザーの要件がある場合は、文字列を暗号化することでそれを行うことができます。これで十分に安全になります。

しかし、それは推奨されません、

2
Badr

Windows Identityから取得するユーザー名と暗号化された認証文字列でトークンを作成する必要があると思います。 Cookieにパスワードを保存する必要はありません。ユーザー名と認証された文字列を保存したアプリケーションがあります

2
Jalpesh Vadgama

ブラニスラフ 言ったこと、そして...

Cookieに機密データを入れないことに加えて、web.configに少なくとも以下を配置することにより、機密データを保護する必要があります。

<httpCookies httpOnlyCookies="true" />

詳細については、以下を参照してください。 ASP.NETでhttpOnlyCookiesをどのように正確に構成しますか?

1
An00bus
  • 安全な情報を送信する場合に必要なSSLを使用すると、サードパーティがWebトラフィックをリッスンするのを防ぎます。ユーザーの資格情報をCookieに保存するかどうかに関係なく、これは同じ問題になります。ユーザーがログインすると、ユーザー名とパスワードがサーバーに送信されるためです。

  • 他のドメインは、クロスオリジンのためにCookieを読み取ることができないため、問題にはなりません。

  • だから、実際に誰かが自分のコンピューターに物理的にアクセスできるようにしたい場合、それは本当に唯一の「セキュリティホール」です。それが起こった場合、彼らはとにかくその人から必要な情報を取得する可能性が高いです。 chrome自動でログインフォームに入力する場合、どのように説明しますか? chrome自動入力を行うページに移動するには、フォームからパスワードをコピーして、その人のパスワードがあることを確認します。

  • 本当に必要なのは、どれだけ「安全」であるかです。有効期限をトークンとしてユーザー情報を暗号化することがサービス呼び出しを認証する最良の方法であり、柔軟性を提供することに同意します。ログイン資格情報をCookieに保存することに関する問題は見当たりません。

0
Troy Valle

安全ではありません。 Cookieはクライアントコンピューターに保存され、改ざんされる可能性があります。

0
Bhaskar