2

PHP を始めてまだ 1 か月も経っていないので、本を読んで学校のプロジェクト用にコードを変更しているだけなので、このコードが貧弱である場合は申し訳ありません。

この検証の意味を理解しようとしていますが、php を初めて使用するため、完全には理解できないようです。

コード:

if (preg_match ('/^(\w*(?=\w*\d)(?=\w*[a-z])(?=\w*[A-Z])\w*){6,20}$/', $_POST['pass']) ) {

        //$p = mysqli_real_escape_string ($dbc, $_POST['pass']);
        $p = $_POST['pass'];
        $sticky_password = $p;

        } else {
        $error['pass'] = 'Please enter a valid password!';
        }

どんな助けでも本当に感謝します! ありがとう!

どうもありがとうございました.. :)

4

2 に答える 2

3

次の正規表現があります。 /^(\w*(?=\w*\d)(?=\w*[a-z])(?=\w*[A-Z])\w*){6,20}$/

  1. 最初と最後/は区切り文字です。

  2. ^-> 始まり$-> 終わり

    つまり、入力がabcで、正規表現が/^bc$/の場合、bc が先頭にないため一致しません。

  3. 今、私たちは持っています(\w*(?=\w*\d)(?=\w*[a-z])(?=\w*[A-Z])\w*){6,20}

    {6,20}量指定子の部分で、6 回から 20 回までを意味します。

  4. 正規表現をさらに分解しましょう:\w*(?=\w*\d)(?=\w*[a-z])(?=\w*[A-Z])\w*

    いくつかの同等物を提供しましょう:

    1. \w=> [a-zA-Z0-9_]
    2. \d=> [0-9]
    3. *=> 0回以上
    4. (?=)先読みアサーションです。例/a(?=b)/これは、任意の "a" の後に "b" が続くものと一致します

    5. これらの先読みの目的:

      • (?=\w*\d)=>数字があるかどうかを確認します
      • (?=\w*[a-z])=> 小文字があるかチェック
      • (?=\w*[A-Z])=>大文字があるかどうかを確認します
      • 取りましょう(?=\w*\d):\w*は、数字の前に [a-zA-Z0-9_]* がある場合の「回避策」として存在します。

最後に、この正規表現は、入力が次のことを確認するだけです。

  1. 長さは 6 ~ 20 文字です
  2. 最小であること: 小文字 1 つ、大文字 1 つ、数字 1 つ
  3. 使用できる文字は、英字 (大文字と小文字 (az、AZ))、数字、アンダースコアです。

3 つの興味深いサイトwww.regexper.comwww.regular-expressions.info、およびwww.regex101.com

注:パスワードを制限しないでください。とにかくパスワードをハッシュする必要があります。こちらをご覧になるか、SOに関する他の質問を確認してください。

于 2013-04-16T22:59:44.187 に答える
0

実際、このパターンは、少なくとも 3 文字 (数字、大文字、小文字の順不同) を含むすべてのパスワードに長さ制限なしで一致します (正規表現エンジンを除く)。すべての文字は単語文字でなければなりません (つまり、クラスから\w)。

作成者の意図は、量指定子と先読みが示唆するように、おそらく 6 ~ 20 語の文字のすべてのパスワードを、少なくとも 1 つの数字、1 つの大文字と 1 つの小文字で一致させることでした。

要するに、このパターンは間違っていますが、おそらくこの古典的なパスワード検証パターンが行うことを目指しています。

^(?=\w*[A-Z])(?=\w*[a-z])(?=\w*\d)\w{6,20}$

またはこれはすべて冗長ではありません\w

^(?=.*[A-Z])(?=.*[a-z])(?=.*\d)\w{6,20}$

説明: 先読みはゼロ幅のアサーションであり、文字を消費せず、単なるテストです。に固定されているため、それぞれの結果は文字列の先頭から実行されます^。それぞれの先読みが成功すると、\w{6,20}常に文字列の先頭からテストされ、6 ~ 20 個の単語文字しか含まれていないかどうかが確認されます。$文字列の終わりを意味します。

コメントで述べたように、このパターンはLarry Ullman 著「Effortless E-commerce」初版から来ています。

著者が書いたとしても:

「そして、確かに、私でさえパターンの適切な構文を調べなければならないことがよくありますが、これには高度な正規表現の専門知識が必要です。」

文の 2 番目の部分に同意できないとしても、このパターンは単純なタイプミスだと思います。ただし、これが第 2 版で修正されているかどうかはわかりません。

于 2013-04-16T22:31:47.917 に答える