Будет ли работать это регулярное выражение? - PullRequest
1 голос
/ 24 июня 2009
^([a-zA-Z0-9!@#$%^&*|()_\-+=\[\]{}:;\"',<.>?\/~`]{4,})$

Подойдет ли это регулярное выражение для этих правил?

  • Должно быть не менее 4 символов
  • Символы могут состоять из букв (заглавных и не заглавных), цифр и следующих символов: @ # $% ^ & * () _ - + = | [{}]; : '", <.>? /

Он предназначен для проверки пароля. Язык PHP.

Ответы [ 6 ]

5 голосов
/ 24 июня 2009

Да

Честно говоря, что вы просите? Почему бы тебе не проверить это?

Если, однако, вам нужны предложения по его улучшению, задайте несколько вопросов:

  1. Что проверяет это регулярное выражение?
  2. Почему у вас такой большой набор разрешенных символов?
  3. Почему бы вам не использовать /\w/ вместо /0-9a-zA-Z_/?
  4. Почему у вас все это в () с? Вам не нужно фиксировать все это, так как у вас уже есть все это, и они не нужны, чтобы группировать что-либо.

Что бы я сделал, это проверил бы длину отдельно, а затем проверил по регулярному выражению, чтобы увидеть, есть ли у него плохие символы. Ваш список хороших персонажей, кажется, достаточно велик, так что может быть проще сделать это таким образом. Но это может зависеть от того, для чего вы это делаете.

РЕДАКТИРОВАТЬ: Теперь, когда я знаю, что это PHP-ориентированный, /\w/ безопасен, потому что PHP использует библиотеку PCRE, которая не совсем Perl, а в PCRE \w будет не соответствовать Unicode слово символы. Таким образом, почему бы не проверить длину и убедиться, что нет недопустимых символов:

if(strlen($string) >= 4 && preg_match('[\s~\\]', $string) == 0) {
  # valid password
}

В качестве альтернативы используйте малоиспользуемый класс символов POSIX [[:graph:]]. В PHP он должен работать почти так же, как и в Perl. [[:graph:]] соответствует любому буквенно-цифровому символу или знаку пунктуации, который звучит так, как вы хотите, а [[:^graph:]] должен соответствовать противоположному. Чтобы проверить, все ли символы соответствуют графику:

preg('^[[:graph:]]+$', $string) == 1

Чтобы проверить, не совпадают ли символы с графиком:

preg('[[:^graph:]]', $string) == 0
1 голос
/ 24 июня 2009

Вы забыли запятую (,) и точку остановки (.) и добавили тильду (~) и серьезный акцент (`), которые не были частью вашей спецификации. Кроме того, необходимо экранировать всего несколько символов внутри объявления набора символов:

^([a-zA-Z0-9!@#$%^&*()|_\-+=[\]{}:;"',<.>?/~`]{4,})$

И это как строковое объявление PHP для preg_match:

'/^([a-zA-Z0-9!@#$%^&*()|_\\-+=[\\]{}:;"\',<.>?\\/~`]{4,})$/'
1 голос
/ 24 июня 2009

Regex приятель ваш друг.

0 голосов
/ 03 июля 2009

Нет. Это регулярное выражение не будет работать с указанными вами правилами по той простой причине, что $ по умолчанию соответствует перед последним символом, если это новая строка. Вы допускаете строки пароля, такие как "1234 \ n".

Решение простое. Либо используйте \z вместо $, либо примените модификатор D к регулярному выражению.

0 голосов
/ 24 июня 2009

Вы экранированы и не используете некоторые предопределенные классы символов (например, \ w или хотя бы \ d).

Помимо этого и того, что вы привязываетесь в начале и в конце, то есть регулярное выражение будет совпадать только в том случае, если строка начинается и заканчивается соответствующим образом, она выглядит правильно:

^([a-zA-Z\d\-!$@#$%^&*()|_+=\[\]{};,."'<>?/~`]{4,})$

Если вы действительно хотите использовать это как средство проверки пароля, оно пахнет небезопасностью:

  • Почему вы разрешаете пароли с 4 символами?
  • Почему вы запрещаете некоторым персонажам? PHP не может справиться с некоторыми? Почему тебя это волнует? Позвольте пользователю вводить символы, которые ему нравятся, в конце концов, вы просто сохраните хеш + соль.
0 голосов
/ 24 июня 2009

Я заметил, что у вас по существу есть все ASCII, за исключением обратной косой черты, пробела и управляющих символов в начале, так что вместо этого?

^([!-\[\]-~]{4,})$
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...