2017-02-16 8 views
2

SQLインジェクションなどを避けるために、ユーザーを信頼してデータベースに格納する前にすべての入力をフィルタすることは絶対に避けてください。ユーザのパスワードをデータベースに保存する前にフィルタする必要がありますか?

ユーザーパスワードはどうですか?保管する前に何らかの浄化を行うべきですか?私がそうした場合、ログインするユーザーのパスワードを入力すると、墨塗りされたバージョンと一致しない可能性があります。

(パスワードは保存前に暗号化されています)。

ベストプラクティスは何ですか?

+0

**平易なパスワードをデータベースに保存しないでください。代わりに、約100msの間、ランダムな塩でHMACを繰り返し、ハッシュで塩を保存してください。 'PBKDF2'(別名' Rfc2898DeriveBytes')、 'password_hash' /' password_verify'、 'Bcrypt'などの関数を使用してください。要点は、攻撃者が無差別にパスワードを見つけるのに多くの時間を費やすことです。ユーザーを保護することが重要です。安全なパスワード方法を使用してください。 – zaph

答えて

3

SQLインジェクションなどを避けるために、ユーザーを信頼してデータベースに格納する前にすべての入力をフィルタすることは絶対に避けてください。

いいえ、まったくありません。プリペアドステートメントを使用してSQLインジェクションを避け、データ表示時に特殊文字を適切にエスケープしてHTML /スクリプトインジェクションを回避することをお勧めします。

私は彼らに

を格納する前にサニタイズの任意の種類を実行する必要があり、あなたはいけません。また、パスワードを暗号化しないでください。代わりに、Bcryptのような強力な暗号アルゴリズムを使用して、それらを暗号化してハッシュする必要があります。

+0

Bcryptは安全な方法であり、単なる塩漬けのハッシュではなく、反復的な方法であり、計算時間は約100ms必要です – zaph

0

は、私はストレージに関してJB Nizetの答えに加えて

...それらを格納する前にサニタイズの任意の種類を実行する必要があり、あなたは 1を受け入れる前に、それらをフィルタリングする必要があります。 パスワード1は、NISTのセキュリティ要件を満たしていますが、攻撃者の上位N個のパスワードリストにも似ています。明らかに、あなたは攻撃者が自分の好きなパスワードリストをあなたに使ってもらうことを望んでいません。

リスト自体はかなり大きくすることができます。私は10,000、100,000、および1000万のサイズを見てきました。リストは、Bloomフィルタを使用して20KBまたは40KBまで圧縮できます。次に、ユーザーがパスワードを選択すると、フィルターに対して候補のパスワードを確認します。ブルームフィルタは、いくつかの偽陽性を生成しますが、それは問題ありません。ユーザーに別のパスワードを選択するよう依頼するだけです。

ここには、10,000パスワードリストのGitHub:noloader/Password-Listsがあります。別のリストはdanielmiessler/SecListsです。 Peter GutmannのEngineering Security, Chapter 6: Passwordsも参照してください。