web-dev-qa-db-ja.com

パスワードの正規表現PHP

オンラインでスクリプトを見つけましたが、JavaScriptでパスワード正規表現があります。私はまだそれを使用したいのですが、セキュリティを強化するためにPHPを使用してパスワードも検証したいのですが、正規表現では役に立ちません。

要求事項:

  • 8文字以上にする必要があります
  • 少なくとも1つの数字を含める必要があります
  • 少なくとも1つの大文字を含める必要があります
  • 少なくとも1つの小文字を含める必要があります

これらの要件を満たすために正規表現文字列を作成するにはどうすればよいですか?

31
Peter Stuart

1つの大きな正規表現でそれを行うことは、コード保守の悪夢のようなものであることがわかります。それを分割することは、コードを見ている他の誰かにとってはるかに簡単に理解でき、より具体的なエラーメッセージを与えることもできます。

$uppercase = preg_match('@[A-Z]@', $password);
$lowercase = preg_match('@[a-z]@', $password);
$number    = preg_match('@[0-9]@', $password);

if(!$uppercase || !$lowercase || !$number || strlen($password) < 8) {
  // tell the user something went wrong
}
60
ceejayoz
^\S*(?=\S{8,})(?=\S*[a-z])(?=\S*[A-Z])(?=\S*[\d])\S*$

Zorched のすばらしい人々から。

  • ^:文字列の先頭に固定
  • \S*:文字のセット
  • (?=\S{8,}):少なくとも長さ8
  • (?=\S*[a-z]):少なくとも1つの小文字を含む
  • (?=\S*[A-Z]):および少なくとも1つの大文字
  • (?=\S*[\d]):および少なくとも1つの数字
  • $:文字列の最後に固定

特殊文字を含めるには、Word以外の文字である(?=\S*[\W])を追加するだけです。

70
Patrick Perini

考えられる正規表現パターンの1つは次のとおりです。

_/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]{8,}$/
_

このように

しかし、あなたは本当にパスワードを制限すべきではありません!

enter image description here

認めて開発者として、私たちはパスワードを適切に処理するには頑固すぎるか怠け者であるため、顧客およびユーザーのオンラインセキュリティの失敗に貢献するためにさらに努力しました。私たちの労働の成果のいくつかを見てください:

パスワードの長さは5〜32文字でなければなりません。有効な文字には、文字、数字、アンダースコアが含まれます。

パスワードの長さは6〜12文字でなければなりません。有効な文字には、文字と数字が含まれます。

パスワードは8文字以上で、少なくとも1つの大文字、数字、アンダースコアや感嘆符などの特殊文字を含める必要があります。

次に、この宝石があります。元の要件は8文字以上でした。誤って7文字を入力すると、ユーザーの前にエラーが表示されます。

enter image description here

パスワード制限が間違っているタグ行に注意してください。アイロニー?

私はここに行くことができますが、私はあなたがポイントを得ると思います。このナンセンスをサポートするコードを作成し、すべてのケースを説明するために適切な正規表現に頭を包みました。伝送、ハッシング、ストレージをめぐる苦悩。私たちはこれについて非常に多くのことを話しましたが、xkcdでのメモリアル化により、状況は適切なポップカルチャーのステータスさえも受けました。

私たちの意図が良かったのは間違いありません。結局のところ、ユーザーと顧客が自分自身を適切に保護することは期待できません。彼らは強力なパスワードを作成せず、Wordの「パスワード」をパスワードとして頻繁に使用します。個人情報の盗難で苦しんでいる友人たちに感銘を受けた警告、ニュース記事、恐怖に耳を傾けません。大規模な小売チェーンをハッキングしても、それらのフェーズはほとんどありません。開発者として、私たちはユーザーがこれらの落とし穴を避けるのを支援するために着手しました。私の試みは失敗に終わり、問題に貢献したかもしれない。

悪化させた可能性が非常に高いです。

パスワードに不可解な制限を設定することにより、ユーザーに悪い考え方を強いることになりました。そのため、ユーザーは抵抗が少なく、単純で、ハッキング可能なパスワードの道を探すようになりました。これは、私たちの制限に慣れていたためです。システム管理者は私たちを8文字に制限しているので、世界の残りの部分に制限を予測しました。立ち止まって、任意の文字を含む任意の長さのパスワードを処理する方法を学びました。パスワードから空白を除外したい場合がありますが、それ以外はパスワードに制限を設けるべきではありません。

その後、パスフレーズやランダムな単語などの適切なセキュリティ対策を奨励できます。ユーザーは、これを発見すると、f @ rtp00pのような文字と数字のあいまいな組み合わせを覚えておく必要がないので、非常に満足します。

目を転がすのが見えます。つまり、パスワードを適切にハッシュする方法と、入力したパスワードとハッシュを比較する方法を学ぶ必要があります。あなたは本当に難しい勝利正規表現を投げる必要があります。天国では、コードのリファクタリングが必要になる場合があります!データベースは非常に大きなハッシュされたパスワードを保持できるため、この機能を利用する必要があります。

データの一般的なセキュリティは、システム管理者や他の開発者と共に私にあることに留意してください。ユーザーのアカウントのセキュリティはユーザーにあり、ユーザーを阻止するために何もするべきではありません。個人的には、ユーザーがパスワードに対して何を持っているかは気にしません。ユーザーがパスワードを作成するときに行うことは、強度メーターといくつかの基本的なガイドラインを提供することだけです。

「パスフレーズまたは複数のWordの組み合わせを使用することは、ログイン情報を解読しようとしているハッカーが成功するのを防ぐために最も安全であることがわかりました。」

何をすべきですか?

PHPの 組み込み関数 パスワードセキュリティを処理する完全に、スペース、特殊文字などすべてを使用している場合。PHP 5.5より前のバージョンでは、password_hash()compatibility pack を使用できます。

パスワードの制限を取り除き、ユーザーがオンラインでセキュリティを所有できるようにする必要があります。あなたは中にいますか?

26
Jay Blanchard

強力なパスワード検証のためのPHP正規表現

上記のリンクは、必要な正規表現のように見えます。以下のコードのようなものを試すことができます:

if(preg_match((?=^.{8,}$)((?=.*\d)|(?=.*\W+))(?![.\n])(?=.*[A-Z])(?=.*[a-z]).*$), $_POST['password']):

echo 'matched';

else:

echo 'not matched';

endif;
2