Существует огромное количество глупостей, когда дело доходит до паролей на веб-сайтах.
- У некоторых есть чисто технические причины (действительные или нет, это другой вопрос, но почти все из них нет):
Ваш пароль должен быть длиной четыре символа и иметь только цифры.
(Ограничив пароль диапазоном 0001 .. 9999, вы можете просто сохранить их как число в виде открытого текста в базе данных)
- Другие объясняются ошибочными мыслями о том, что они сделают пароли более безопасными :
Ваш пароль должен начинаться с заглавной буквы и заканчиваться цифрой.
(Делая это, разработчик или менеджер предполагал, что это фактически заставит пользователей выбирать безопасный пароль, в то время как правило «Ваш пароль должен содержать не менее 6 символов и содержать как минимум одну заглавную букву, строчную букву и цифра "волшебным образом не сможет этого сделать)
- Другие, наконец, объясняются тем фактом, что пароли хранятся в виде открытого текста , и есть некоторые неясности относительно того, как они хранятся, обрабатываются или извлекаются, и нет времени для их модульного тестирования.
Ваш пароль содержит недопустимый символ é
.
или,
Ваш пароль y$₯46¥*A'xD<7&฿=ᴙcN&sF5_Ở!d
содержит недопустимые символы. Используйте символы только латинского алфавита и цифры.
или,
Ваш пароль не может содержать пробельные символы.
Во всех трех случаях разработчик был просто уверен, что пароли, подобные этому, будут храниться правильно.
В первом случае, что, если é
будет преобразовано %C3%A9
при отправке? Или что, если база данных будет храниться é
неправильно?
Во втором случае, что если PHP (почему PHP?) Не может работать с юникодом и делает что-то ужасное при получении такого пароля? Что, если <
персонаж вызывает проблемы? Что если &
символ интерпретируется как разделитель в URL-адресе (при условии, что по какой-то причине пароль отправляется через GET вместо POST)? Что если '
интерпретируется базой данных, потому что, угадайте, что, мы понятия не имеем, что такое SQL-инъекция и как ее избежать? Или что, если '
превращается в \'
?
В третьем случае, что если PHP (снова?) Обрезает пробелы в одних случаях, а не в других? Что делать, если администраторы (которые неожиданно имеют доступ к паролям пользователей в виде открытого текста) теряются, потому что они видят только один пробел, в то время как пользователь установил три последовательных пробела ?
Во всех трех случаях эти неоднозначности легко решаются путем тестирования , особенно модульного тестирования. Но в огромном количестве проектов вообще нет тестирования и нет времени на тестирование (но все равно остается много времени для отладки позже).
Это означает, что разработчик пытается подумать о возможных последствиях использования пробелов , символов Юникода или просто любого символа вне ASCII 48..57 ∪ 65..90 ∪ 97..122 (цифры, строчные буквы, прописные буквы) , самый простой способ, когда это невозможно, это просто запретить их .
На мой взгляд, это единственная причина запрета пробелов. Яннис Ризос привел еще одну причину, связанную с UX. Хотя это и является правдоподобной причиной в теории, на практике это совсем не работает: веб-сайты, созданные людьми, которые действительно заботятся о UX, не устанавливают глупые правила паролей. Вместо этого веб-сайты, где пробелы фактически запрещены, в большинстве случаев создаются людьми, которые никогда не слышали о UX . Это особенно верно, поскольку запрет любого символа действительно раздражает с точки зрения UX, как любое ограничение, связанное с паролем, включая полезные, как минимальное количество символов.