Методика регулярных выражений для выражения пароля - PullRequest
0 голосов
/ 25 января 2019

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

$scope.userObj.user_password.match(/^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#\$%\^&\*])(?=.{8,})/)

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

Во-вторых, очевидно, что вышеприведенное не работает, поэтому, чтобы заставить его работать, мне нужно изменить часть специальных символов на (я думаю) следующее: (?=.*[!@#\$%\^&\*\.\,\(\)\-\+\=])

В моей БД я шифрую пароль с помощью PHP SHA512, а затем сохраняю его в стандартном столбце mysql schar (128).

A: Этого будет достаточно для моего регулярного выражения, чтобы правильно включать периоды? использование периодов также заставляет меня задуматься, нужно ли мне включать другие стандартные символы клавиатуры, такие как, () - + = и т. д. (также включены в новое регулярное выражение).

Б: А потом, как далеко вы зашли в кроличью нору - это ~ и `и [,], {,}, \, | персонажи, которые тоже нужно учитывать? Есть ли лучший способ определить их все без необходимости перечислять их индивидуально

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

1 Ответ

0 голосов
/ 25 января 2019

Ответ A: Если вы протестируете свое первое регулярное выражение (https://www.phpliveregex.com/), вы увидите, что оно уже принимает периоды, потому что вы включаете .* после каждого положительного просмотра (?=) .

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

Другими словами, ваше регулярное выражение является хорошим «белым списком», но у вас нет «черного списка». Вы должны сделать еще один тест, чтобы принять только те символы, которые вы хотите

Как: inputValue.replace(/[^a-zA-Z0-9\!\.\#\$\^]/, "");

Ответ B: О том, какие символы вы будете принимать в пароле ... Правил нет. Вы являетесь администратором, и вы можете принять все, что захотите, так как вы корректируете / экранируете свои входные данные перед анализом и внедрением.

Если у вас большой список специальных символов, вы закончите с большими регулярными выражениями. Но вам не нужен большой список, это может быть так же просто, как! , # $ ^

Ответ C: Проблемы безопасности с пользовательским вводом происходят, когда вы выполняете команды SQL или эхо PHP, печатаете с пользовательским вводом без очистки / правильного сброса.

Вот действительно хороший ответ по теме https://stackoverflow.com/a/130323/10677269

Наконец, вы должны рассмотреть комментарии выше. SHA512 не является шифрованием (это алгоритм дайджеста) и не должен использоваться для хранения пароля в вашей базе данных, если вы не «засолите» его (даже в этом случае шифрование является лучшим вариантом).

...