Ответ A: Если вы протестируете свое первое регулярное выражение (https://www.phpliveregex.com/), вы увидите, что оно уже принимает периоды, потому что вы включаете .*
после каждого положительного просмотра (?=)
.
Ваше регулярное выражение эффективно для обеспечения того, чтобы ваши входные данные имели по крайней мере один нижний регистр И один верхний регистр И один специальный символ И минимум восемь символов, но он также принимает все остальное.
Другими словами, ваше регулярное выражение является хорошим «белым списком», но у вас нет «черного списка». Вы должны сделать еще один тест, чтобы принять только те символы, которые вы хотите
Как: inputValue.replace(/[^a-zA-Z0-9\!\.\#\$\^]/, "");
Ответ B: О том, какие символы вы будете принимать в пароле ... Правил нет. Вы являетесь администратором, и вы можете принять все, что захотите, так как вы корректируете / экранируете свои входные данные перед анализом и внедрением.
Если у вас большой список специальных символов, вы закончите с большими регулярными выражениями. Но вам не нужен большой список, это может быть так же просто, как! , # $ ^
Ответ C: Проблемы безопасности с пользовательским вводом происходят, когда вы выполняете команды SQL или эхо PHP, печатаете с пользовательским вводом без очистки / правильного сброса.
Вот действительно хороший ответ по теме https://stackoverflow.com/a/130323/10677269
Наконец, вы должны рассмотреть комментарии выше. SHA512 не является шифрованием (это алгоритм дайджеста) и не должен использоваться для хранения пароля в вашей базе данных, если вы не «засолите» его (даже в этом случае шифрование является лучшим вариантом).