Вопрос

В PHP я хотел бы использовать фильтр preg_replace() для паролей таким образом, чтобы единственными доступными символами для паролей были символы, набираемые в формате US ASCII, минус управляющие коды и NULL.

Какое регулярное выражение используется для достижения того, что я могу подключить к preg_replace()?

Редактировать:

Мне посоветовали отредактировать этот вопрос, так как я "понял это" сейчас и не буду использовать эту ужасно непопулярную технику и разрешу любые вводимые символы, даже те, которых у меня может не быть на клавиатуре, при условии, что они не являются управляющими кодами.

Это было полезно?

Решение

Как уже говорили другие, не ограничивайте набор символов, разрешенных в паролях.Просто потому , что ваш на клавиатуре нет символов ä, å или ö, это не причина останавливать тех из нас, у кого они есть (или кто все равно знает, как их печатать), от использования этих букв.Вы все равно собираетесь хранить пароль в виде криптографического хэша (или, по крайней мере, в виде зашифрованной строки), не так ли?Если это так, то не имеет значения, может ли ваша база данных в любом случае успешно / безопасно хранить фактические символы в пароле, только символы, выводимые вашим криптоалгоритмом.(А если нет, то хранение паролей в виде открытого текста является далеко проблема посерьезнее, чем то, какие символы могут содержать пароли, а какие нет - не делайте этого!)

Ваше очевидное намерение ввести ограничения на набор символов путем молчаливого удаления символов, которые вам не нравятся, вместо того, чтобы сказать пользователю "Попробуйте еще раз и на этот раз используйте только эти символы:a, e, i, o, u". делает предлагаемый вами метод поистине чудовищным, поскольку это означает, что если я попытаюсь использовать, скажем, пароль fäîry (не очень безопасный, но должен противостоять легким атакам по словарю), мой фактический пароль, неизвестный мне, будет fry (если ваш пароль состоит из трех букв, взятых прямо из словаря и широко используемых, вы можете даже не беспокоиться).Ой!

Другие советы

Лично меня всегда очень беспокоило, когда веб-сайт или служба пытались заставить меня использовать пароли, которые соответствуют определенному (обычно совершенно глупому) ограничению.

Разве весь смысл паролей не в том, что их не слишком легко угадать?Почему вы хотите, чтобы они были менее сложными, чем того хотят ваши пользователи?Я не могу представить себе техническое ограничение, которое требовало бы использования "только ASCII" для паролей.

Позвольте вашим пользователям использовать любой пароль, который им нравится, хэшируйте его и сохраняйте в виде строк Base64.Это только ASCII.

Держи, ты идешь:

^[ -~]+$

предполагая, что вам не нужны пустые пароли;в противном случае это:

^[ -~]*$

чтобы разрешить пустые.

Я не совсем понимаю, почему вы спрашиваете о preg_replace - Я бы поостерегся манипулировать паролями, которые вводят люди.Лучше обеспечить соблюдение правила, согласно которому вы принимаете только печатный ASCII-код, и сообщать пользователю, если он нарушает это правило (или, как говорили другие, не иметь никаких правил, но я предполагаю, что у вас есть причины для них).

Если вы подумываете о том, чтобы незаметно удалить символы, которые не совпадают, и кто-то приходит с паролем в виде Uéåæ, то вы будете хранить пустой пароль для них без их ведома.

Пожалуйста, не фильтруйте пароли ваших пользователей.Это сводит на нет большую часть смысла.Подробнее я написал об этом здесь: http://www.evanfosmark.com/2009/06/why-do-so-many-websites-fail-with-password-restrictions/

Я не согласен с тем, что нет причин отвергать символы, отличные от ascii, хотя вам решать, перевешивают ли плюсы минусы.

Если вы разрешаете использовать символы, отличные от ascii, то фактически вы обязуетесь должным образом интернационализировать эту часть вашего веб-приложения.Для многих приложений интернационализация является запоздалой мыслью.Для веб-приложений это очень нетривиальный вопрос.

Если вы явно не управляете кодировкой символов при переходе между символами и байтами, то вы в основном полагаетесь на любые значения по умолчанию для вашего развертывания.Если ваша конфигурация когда-либо изменится (напримерпереход с Windows на Linux или переключение на другой веб-сервер), тогда ваши значения по умолчанию имеют хорошие шансы измениться из-за вас, и тогда символы, отличные от ascii, будут сериализованы в другую последовательность байтов.Таким образом, внезапно хэши людей, использующих их в своих паролях, не будут совпадать с тем, что есть в базе данных, и они будут заблокированы из своих учетных записей.

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

/[\p{Cc}]/ чтобы получить управляющие символы (я думаю, это относится к 0-31)

Я согласен с Ричи.Используйте preg_match вместо preg_replace.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top