Ответ 1
ОК, поэтому допустим, что вы выполняете все свои задачи по кодированию строк. У вас нет инъекций SQL, инъекций HTML или мест, где вы не кодируете URL-адреса. Поэтому нам не нужно беспокоиться о таких персонажах, как "< &% \", которые являются магии в некоторых контекстах. И вы используете UTF-8 для всего, чтобы весь Unicode был в игре. Какие еще существуют причины для ограничения имен пользователей
Для начала, все управляющие символы, для здравомыслия. Нет никаких причин иметь символы U + 0000 в U + 001F или U + 007F до U + 009F в имени пользователя.
Далее, запретить или нормализовать неожиданные пробелы. Возможно, вы захотите разрешить пробел в имени пользователя, но вы почти наверняка не хотите разрешать начальные пробелы, конечные пробелы или несколько пробелов подряд. Они могут сделать то же самое в HTML, но, вероятно, это ошибка пользователя, которая будет запутать.
Если вы намерены разрешить использовать это имя для входа в систему через базовую аутентификацию HTTP, вы должны запретить символ :
, потому что схема Basic Auth кодирует пару "имя пользователя: пароль" без экранирования, если двоеточие в имя пользователя или пароль. Таким образом, по крайней мере одно из имени пользователя и пароля должно исключать двоеточие, и лучше, чтобы имя пользователя, поскольку ограничение доступа к паролям было намного хуже, чем имена пользователей.
Для базовой проверки подлинности вы также можете отключить все символы, отличные от ASCII, поскольку они обрабатываются разными браузерами по-разному. IE кодирует их с использованием кодовой страницы системы; Firefox кодирует их с использованием ISO-8859-1; Opera кодирует их с помощью UTF-8. Пользователи должны, по крайней мере, быть предупреждены перед выбором не-ASCII-имен, если HTTP Auth будет доступен, так как фактически их использование будет очень ненадежным.
Далее рассмотрим другие управляющие последовательности Unicode, такие как bidi переопределяют, а другие символы, перечисленные там, непригодны для использования в разметке. Вероятно, вы собираетесь положить их в разметку, и вы не хотите, чтобы кто-то с RLO в их имени превращал нагрузку текста на вашу страницу назад.
Кроме того, если вы разрешаете Unicode делать нормализацию по строкам, которые вы получаете. В противном случае у кого-то может быть имя пользователя с составленным символом o-umlaut ö
и задаться вопросом, почему они не могут войти в систему на Mac, который по умолчанию будет использовать отдельный символ o
, за которым следует объединение umlaut. Обычное нормализовать составленную форму NFC в Интернете. Вы также можете использовать разложения совместимости с использованием формы NFKC; это позволило бы пользователю Крису войти с японской клавиатуры в режиме fullwidth romaji, набрав Криса. Это общие проблемы, которые хорошо решить для всего вашего входа в webapp, но для идентификаторов, таких как имена пользователей, может быть более важно получить право.
Наконец, убедитесь, что длина в порядке, чтобы вписаться в базу данных без тихой усечки, изменяющей имя, особенно если вы храните в виде байтов UTF-8, которые вы не хотите перерезать на полпути через последовательность байтов. Укрупнение имен также может быть проблемой безопасности в целом.
Если вы используете имена пользователей как уникальное средство идентификации, вам гораздо больше нужно беспокоиться о: уже упомянутой проблеме похожих взглядов, таких как Сhris
(с кириллицей Es С
). Их слишком много для разумного обращения; либо ограничивать ASCII, либо иметь дополнительные средства идентификации пользователей. (Или не волнует, как SO не делает, когда я могу легко называть себя Крисом, в любом случае мне не нужно называть себя С
-hris.)