Как мне локализовать проверку пароля в C #?
-
18-09-2019 - |
Вопрос
Я пытаюсь локализовать существующее приложение, которое имеет следующую логику, которая пытается подтвердить текстовое поле пароля.Я предполагаю, что это не будет работать с языками со специальными символами, которые пользователь мог бы ввести в текстовое поле.Я прав?Я не думаю, что мы хотим ограничить пользователя от ввода символов неанглийского типа (т.е.арабский, китайский и т.д.).Или есть что-то, чего я не понимаю?
Regex ValidHex =
new Regex("[A-Za-z1234567890_-]+", RegexOptions.IgnoreCase);
if (!ValidHex.IsMatch(e.Text))
{
e.Handled = true;
}
Решение
Вы можете сделать подобное для поддержки символов юникода:
[\p{L}\p{N}_-]+
В качестве дополнительного примечания:есть ли какая-то конкретная причина, по которой вам нужно ограничить количество разрешенных символов?
Другие советы
Не храните пароли!
Хэшируйте пароль с помощью функция криптографического хеширования и сравните это.
Это регулярное выражение не особенно хорошее, оно ограничивает возможности пользователей и ничего не применяет (пароли 'a' и 'aaaaaaa' будут передаваться).Название предполагает, что оно было заимствовано из выражения, которое проверяло шестнадцатеричные числа.Вам, по крайней мере, пришлось бы добавить условие минимальной длины (в reg ex или как e.Text.Length > 8).
Более разумное выражение подтвердило бы, что использовался по крайней мере 1 символ из нескольких групп, я откопал это: @"^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*\W)"
Смотрите здесь.Опять же, добавьте проверку минимальной длины.
В этом примере не рассматривается проблема локализации, он допускает использование нелатинских символов только через '.' и не рассматривает их как удовлетворяющие требованиям [a-z] или [A-Z].
Вы пробовали использовать \w вместо A-za-z?Держу пари, это позволит обойти проблемы с локализацией.