web-dev-qa-db-ja.com

フォームの送信に失敗すると、パスワードフィールドが空白になりますが、それはなぜですか?

多くの登録フォームで、フィールドが検証に合格しない場合、パスワードフィールドも空白になっています。

これはなぜですか?ログインフォームでパスワードを空白にする理由を理解しましたが、ここでは登録フォームのみを参照しています。

26
ALH

フォームがサーバー側の検証によって拒否された場合、パスワードはクライアントに送り返す必要がないため、空白にする必要があります

この問題は インライン検証 で簡単に解決できますが、拒否されない限りフォームを送信できず、フォームデータが失われることはありません。

パスワードは、インライン検証がサーバー側の検証と一致しないというまれな状況、またはクライアントでJavaScriptが無効になっている場合にのみ失われるべきであり、実際に設計することはできません。

28
Ben Brocka

これが当てはまるのには、非常に優れた技術的な理由があります。パスワード付きのフォームを送り返すと、ページ内のパスワードがクリアテキストであるページがキャッシュされる可能性があります。

<input type="password" value="YouCanSeeMe!" />

10
Andy

他の人が述べたように、これはフォームがサーバー側の検証に失敗したときに発生します。安全に設計されたシステムは、パスワードを送り返しません(パスワードはキャッシュされる可能性のあるHTMLの一部であるため)。ここには2つの問題があります。1つはユーザビリティの問題、もう1つは技術的な問題です。

技術的な問題は、パスワードを送り返すことが大きなセキュリティホールになることです。サイトの開発者であるあなたは、HTMLがどのようにキャッシュされるかについて最終的な判断を下すことはできません。提案を行うことができるだけです。バグの多いブラウザと不良プロキシの間(企業環境では、プロキシをルートCAとしてクライアントマシンに追加することによりMITM SSLプロキシを頻繁に実行します)、パスワードがプレーンテキストのディスクのどこかに終わらないことを想定すると、リスクが高すぎます。また、キャッシュされたファイルに簡単にアクセスできるかどうかは重要ではありません(たとえば、C$を介して)– defense in depth ;の安全なシステム設計。プレーンテキストのパスワードが存在するだけでは、設計の失敗です。

ユーザビリティの問題は、システムがsecond、hiddenエラーを作成したことです。サーバー側の検証に失敗した後、フォームページは通常、クライアントに送り返されます。各非機密フィールドのvalueは、送信された(無害化された)値と、フィールドによるエラーメッセージに設定されます。 (s)検証の問題を引き起こした。

もちろん、パスワードフィールドが空白になっているため、最初の検証エラーからのエラーを修正し、[送信]をクリックすると、2番目の検証エラーが発生し、パスワードが空になり、ユーザーの不満が生じます。このユーザビリティの問題に対処するには、いくつかの方法があります。

  • クライアント側の検証を使用します。
  • サーバー側の検証が失敗した場合は、ハッシュされたパスワードをセッション変数に格納し、パスワードフィールドのvalue********(文字通り、8つのアスタリスク)のようなものに設定します。フォームがパスワード********で再送信される場合は、保存されているパスワードを使用します。そうでない場合は、送信されたものを使用します(ユーザーが再送信する前にパスワードを変更することを決定した場合)。
7
josh3736

私が考えることができる1つの直接的な理由...

通信の問題などが原因で応答が得られない場合は、ユーザーが不在の可能性があり、他の誰かが以前に入力したパスワードを使用してログインする可能性があります。ログインに失敗したと想定していたため、ログアウトしていない可能性があります。

編集:

サインアップとログインの両方で、失敗後、新しいフォームが受信されます。ブラウザーがパスワードを保存しなかった場合、フォームにパスワードを入力し直すだけで、ブラウザーにパスワードを送り返すことになります。これにより、セキュリティが低下する可能性があります。

サインアッププロセス中にパスワードをリセットするのは面倒です。これは、ユーザーがパスワードを忘れないようにするためのものだと思います。

例えば。ただし、ユーザー名としてuser1を選択し、パスワードとしてpass1を選択し、ブラウザのパスワードの保存を考慮した場合、user1がパスワードをuser2に変更したため、別のユーザー名で送信されたため、ブラウザにパスワードが保存されない可能性があります。 。また、ユーザーは、パスワードがユーザー名に関連付けられることを期待していたため、混乱する可能性があります(例:pass2)。

0
Danny Varod

ベンは正しいと思います。しかし、それだけではありません。ユーザーがパスワードを再度書き込むように強制された場合、パスワードは入力したパスワードであることが確実になります。

パスワードがサーバーから送り返された場合、ユーザーにはマスクされて表示されます。彼女は現在の値が何であるかわからないか、以前に入力したものを忘れてしまいます。またはおそらく両方:-)

0
Daniele