2009-10-23 2 views
3

Я хочу потребовать следующее:Regex для требований паролей

  • ли больше семи символов.
  • Содержит не менее двух цифр.
  • Содержит не менее двух специальных (не буквенно-цифровых) символов.

... и я придумал это сделать:

(?=.{6,})(?=(.*\d){2,})(?=(.*\W){2,}) 

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

(\S)\1+ 

... но если я попытаюсь объединить два вместе, это не сработает.


Я работаю в рамках ограничений приложения. Это требование по умолчанию - длина 1 символ, не регулярное выражение и нестандартные символы.

Во всяком случае ...

Использование this test harness, я ожидал бы y90e5 $, чтобы соответствовать, но y90e5 $ $ не.

Что мне не хватает?

+23

Я не думаю, что могу описать, насколько я ненавижу системы, которые имеют раздражающие ограничения пароля. –

+0

Оберните однострочный код в \. Не указывайте звездочки, если хотите список. – Tordek

+4

Это те пароли, которые я пишу на post-its. Специальное приложение? –

ответ

6

Иногда мы не можем влиять на технические характеристики и должны писать реализацию независимо от того, когда какая-то древняя система backoffice должна взаимодействовать через Интернет, но имеет определенные ограничения на ввод или просто потому, что ваш босс просит вас.

EDIT: удалено регулярное выражение, которое было основано на original regex пользователя.

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

Моего варианта: два или более \W и \d может быть повторен друг другом, но не может появляться рядом друг с другом (это было мое неверным предположение), я установил его для длины> 7, который несколько более эффективен для размещения в качестве типичного выражения «захватить все».

^(?!.*((\S)\1|\s))(?=.*(\d.+){2,})(?=.*(\W.+){2,}).{8,} 

Новая версия в оригинальный вопрос: два или более \W и \d могут появляться рядом друг с другом. Эта версия в настоящее время поддерживает длину> = 6, а не длину> 7, как объясняется в тексте.

Текущий ответ, исправленное, должно быть что-то вроде этого, который принимает обновленное д, мои комментарии по длине> 7 и оптимизаций, то он выглядит следующим образом:. ^(?!.*((\S)\1|\s))(?=(.*\d){2,})(?=(.*\W){2,}).{8,}.

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

+4

-1: Разработчик, заслуживающий своей соли, не собирается реализовывать «функцию», которую он знает, чтобы быть хуже, чем не иметь вообще. +1: Это правильный ответ на проблему OP. В целом: +0. – Welbog

+1

Мне пришлось создавать интерфейсы для систем, которые были разработаны в 60-е годы, которые имели серьезные ограничения на ввод символов. Я также знаю университет, который имеет внутренние ограничения на пароли. И не редкость, что «английские слова» отфильтровываются, чтобы заставить «хорошие» пароли. Ужасно, да. Но, к сожалению, многие считают «хорошей» практикой. О, и самое плохое: недавно я зарегистрировался у нескольких хостинг-провайдеров. Мои конфиденциальные данные защищены за ** max 8 символов длиной буквы/цифры только ** пароль. В этом мире! Я отменил. – Abel

+0

@Abel: Хорошая работа, отменяющая учетную запись с 8 символами. Вы также позвонили в компанию, чтобы рассказать им, почему вы отменили? Вы получаете +1 от меня, чтобы доказать, что вы знаете разницу между правильным и неправильным в отношении доменов паролей. – Welbog

11

Это плохое место для регулярного выражения. Вам лучше использовать простую проверку.

+12

Еще лучше: не выполнять валидацию вообще. Обеспечьте минимальную длину и ** ничего больше **.Ограничение домена паролей путем ограничения ограничений на них ** упрощает их взлома **, не более безопасное. – Welbog

+1

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

+0

Или сохраните проблему «вопросов безопасности», когда пользователь забывает пароль, используя секретный вопрос, а не пароль. т. е. требует, чтобы пароль пользователя был его любимым цветом. В наши дни все профессиональные сайты занимаются вопросами безопасности, поэтому они должны быть очень безопасными! – Jay

0

Если правило было что пароли должны были быть двумя цифрами, за которыми следуют три буквы или некоторые из них, или курс регулярного выражения будет работать очень красиво. Но я не думаю, что регулярные выражения действительно предназначены для такого правила, которое вы на самом деле имеете. Даже если вы его заработаете, это будет довольно загадочно для бедного присоска, который должен поддерживать его позже - возможно, вы. Я думаю, было бы намного проще просто написать быструю функцию, которая прокручивает символы и подсчитывает, сколько всего и сколько из каждого типа. Затем в конце проверьте подсчеты.

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

+1

Недавние функции регулярного выражения с внешним видом делают такие вопросы относительно легкими для решения. Конечно, это всегда спорно ли не регулярное выражение более читаемый или понятно, то обычный старый код необходим. – Abel

1

Это может быть не самый эффективный, но, похоже, работает.

^(?!.*(\S)\1)(?=.{6,})(?=(.*\d){2,})(?=(.*\W){2,}) 

Тестовые строки:

  • ad2f # WE1 $ // матч действителен.
  • adfwwe12 # $ // No Match repeat ww.
  • y90e5 $$ // No Match repeat $$.
  • y90e5 $ // Нет Совпадение слишком короткое и только 1 \ W значение класса.

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

^(?!.*(\S)\1|.*\s)(?=.{6,})(?=(.*\d){2,})(?=(.*\W){2,}) 

Ваш двигатель регулярного выражения может анализировать (?!.*(\S)\1|.*\s) по-разному. Просто будьте в курсе и соответствующим образом отрегулируйте.

Все предыдущие результаты испытаний одинаковы.
Тест строка с пробелами:

  • ad2f # WE1 $ // Нет матч пространство в строке.
+0

Если вы скопируете мои решения, скопируйте их правильно. '+' В '\ 1 +' избыточен. – Abel

+0

Обратите внимание, что ваше регулярное выражение соответствует 'a4 & 6 b *' (пробелы) и 'a4 & * 3d' (6 символов). Это было неправильно в исходном регулярном выражении уже: '\ S', казалось, подразумевал:« нет пробелов », но это не отразилось нигде. Вы можете скопировать эту часть моего регулярного выражения, если хотите, чтобы более поздние посетители увидели правильное решение :) – Abel

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