10

PHPでは、パスワードにpreg_replace()フィルターを使用して、パスワードに使用できる文字がUS ASCIIで入力可能で、制御コードとNULLを除いたものだけになるようにしたいと思います。

preg_replace()にプラグインできるものを実現するための正規表現は何ですか?

編集:

私は今「理解」しているので、この質問を編集するようにアドバイスされています。このひどく人気のないテクニックは実行せず、キーボードにない文字でも、そうでない限り、入力可能な文字を許可します。制御コード。

4

6 に答える 6

19

他の人が言っているように、パスワードで許可される文字のセットを制限しないでください。キーボードにä 、å、またはöがないからといっ、それらを持っている(またはとにかくそれらを入力する方法を知っている)私たちがそれらの文字を使用するのを止める理由はありません。とにかく、パスワードを暗号化ハッシュとして(または少なくとも暗号化された文字列として)保存することになりますね。もしそうなら、データベースがパスワードに実際の文字を正常に/安全に保存できるかどうかは問題ではなく、暗号化アルゴリズムによって出力された文字のみです。(そうでない場合、パスワードをプレーンテキストで保存することは、パスワードに含まれる文字と含まれない文字よりもはるかに大きな問題です。そうしないでください!)

ユーザーに「もう一度やり直して、今回は次の文字のみを使用してください:a、e、i、o、u」と言うのではなく、嫌いな文字を黙って削除することで、文字セットの制限を適用するというあなたの明らかな意図。提案された方法は本当にひどいものになります。たとえば、パスワードfäîry(信じられないほど安全ではありませんが、軽量の辞書攻撃に耐える必要があります)を使用しようとすると、私にはわからない実際のパスワードがfry(パスワードの場合)は3文字の単語で、辞書から直接出て、一般的に使用されているので、気にしない方がよいでしょう)。痛い!

于 2009-06-29T10:56:28.127 に答える
10

個人的には、Webサイトまたはサービスが、特定の(通常はまったくばかげた)制限に従うパスワードの使用を強制しようとしたときに、常に非常に不安を感じていました。

簡単に推測できないのは、パスワードの要点ではないでしょうか。ユーザーが望んでいるよりも複雑でないようにしたいのはなぜですか?パスワードに「ASCIIのみ」を使用する必要がある技術的制限を想像することはできません。

ユーザーが好きなパスワードを使用できるようにし、それらをハッシュしてBase64文字列として保存します。これらはASCIIのみです。

于 2009-06-28T13:33:56.343 に答える
4

どうぞ:

^[ -~]+$

空のパスワードが必要ないと仮定します。それ以外の場合:

^[ -~]*$

空のものを許可します。

なぜあなたが質問しているのかわかりませんpreg_replace-人々が入力するパスワードを操作することには注意が必要です。印刷可能なASCIIのみを受け入れるというルールを適用し、そのルールに違反していないかどうかをユーザーに通知することをお勧めします(または、他の人が言っているように、ルールはありませんが、理由があると思います)。

一致しない文字を静かに削除することを考えていて、誰かがÚéåæのパスワードを持ってきた場合、知らないうちに空のパスワードを保存することになります。

于 2009-06-28T13:27:39.973 に答える
1

ユーザーパスワードをフィルタリングしないでください。それは多くのポイントを打ち負かします。私はこれについてもっとここに書いた:http://www.evanfosmark.com/2009/06/why-do-so-many-websites-fail-with-password-restrictions/

于 2009-06-29T09:32:01.950 に答える
0

/ [\ p {Cc}] /制御文字を取得する(これは0〜31をカバーすると思います)

リッチーに同意します。preg_replaceの代わりにpreg_matchを使用してください。

于 2009-06-28T13:50:22.613 に答える
0

長所が短所を上回るかどうかを決定するのはあなた次第ですが、非ASCII文字を拒否する理由がないことに同意しません。

非ASCII文字を許可する場合、実際には、Webアプリケーションのその部分を適切に国際化することを約束しています。多くのアプリケーションにとって、国際化は後付けです。Webアプリケーションの場合、これは非常に重要な問題です。

文字とバイトの間を移動するときに文字エンコードを明示的に制御しない場合は、基本的に、デプロイメントのデフォルトが何であれ、それに依存しています。構成が変更された場合(たとえば、WindowsからLinuxへの移行、または別のWebサーバーへの切り替え)、デフォルトが変更される可能性が高くなり、ASCII以外の文字が別のバイトシーケンスにシリアル化されます。そのため、突然、パスワードでそれらを使用している人々のハッシュはデータベースにあるものと一致せず、アカウントからロックアウトされます。

もちろん、これらの文字を除外することはまったく受け入れられないことに同意します。パスワードを受け入れるか拒否する必要があります。

于 2009-07-02T20:43:34.060 に答える