2009-06-24 8 views
1
^([[email protected]#$%^&*|()_\-+=\[\]{}:;\"',<.>?\/~`]{4,})$ 

Будет ли это регулярное выражение работать для этих правил?Будет ли это регулярное выражение работать?

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

Он предназначен, чтобы быть валидатор пароля Язык PHP

+5

Если вы используете это для проверки пароля, мой вопрос таков: почему вы ограничиваете типы символов, которые они могут использовать? Вам действительно нужно только проверить минимальное количество символов – MahlerFive

+2

И 4 символа слишком мало для чего-то заслуживающего защиты. И если это не стоит защищать, зачем добавлять пароль? –

+0

@MahlerFive Этого было бы достаточно? Обратите внимание, что пароли будут хешированы + соленые до того, как они будут проверены на БД. Если проверки количества символов в пароле будет достаточно, я больше не буду использовать это регулярное выражение. @Vinko Как я уже сказал в приведенном ниже комментарии, я использовал только 4, потому что он в настоящее время находится в разработке, и 4 символа легче вводить при входе в систему. – Nikko

ответ

5

Да?

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

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

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

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

EDIT: Теперь, когда я знаю, что это 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 
+0

Я тестировал регулярное выражение, но я просто хотел убедиться, что это правильно, поскольку я не очень хорошо делаю регулярные выражения (как вы можете видеть, регулярное выражение, которое я сделал, не очень оптимизировано). В принципе, я создаю здесь регулярное выражение пароля, и мне нужно это регулярное выражение, которое не является строгим (не требует, чтобы у вас был один заглавный, один специальный символ, один номер и т. Д.), Но все же имеет белый список «хороших» символов. Можете ли вы предоставить лучшую версию моего регулярного выражения? – Nikko

+0

Спасибо, это работает. – Nikko

+0

Можете ли вы объяснить, что именно «[\ s ~ \\\]» точно проверяет? – Nikko

1

Regex buddy ваш друг

+2

Нет, это не так. –

+1

Почему бы и нет ......? – Ankur

+2

Это не очень полезно. Я знаю, как писать регулярные выражения, и я могу написать свои собственные, и если мне сложно писать, я должен спросить, почему я должен выполнять эту работу в одном регулярном выражении. Зачем мне платить деньги за инструмент, который может сделать только половину этого? –

1

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

^([[email protected]#$%^&*()|_\-+=[\]{}:;"',<.>?/~`]{4,})$ 

И как PHP строки декларации для preg_match:

'/^([[email protected]#$%^&*()|_\\-+=[\\]{}:;"\',<.>?\\/~`]{4,})$/' 
+0

Я отредактировал исходное цитированное регулярное выражение, чтобы отразить, и. , и я добавил ~ и 'к спецификациям. – Nikko

0

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

^([!-\[\]-~]{4,})$ 
+0

В принципе, я создаю здесь регулярное выражение пароля, и мне нужно это регулярное выражение, которое не является строгим (не требует, чтобы у вас был один заглавный, один специальный символ, один номер и т. Д.), Но все же белый список «хороших» персонажей. Может ли ваше регулярное выражение сделать это? – Nikko

+0

Кстати, в дополнение к приведенным выше данным, я использую регулярное выражение с preg_match в PHP. – Nikko

+0

Почему вы запрещаете некоторые персонажи? И почему вы разрешаете 4 пароля паролей? –

0

Вы дополнительны побега и не использовать некоторые предопределенные классы символов (например, \ ш, или, по крайней мере, \ г).

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

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

Если вы на самом деле означает чтобы использовать это как средство проверки пароля, оно остается неуязвимым:

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

Класс символов \ w будет соответствовать более чем просто ASCII. – Joey

+0

Верно, вот почему я его не использовал. –

+0

@Johannes - Только на Perl. В PCRE я не думаю, что так будет. –

0

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

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

Смежные вопросы