Preg_replace Фильтр для паролей

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

Что RegEx для достижения того, что я могу подключить к preg_replace()?

EDIT:

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

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 3

Здесь вы идете:

^[ -~]+$

если вы не хотите пустых паролей; в противном случае это:

^[ -~]*$

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

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

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

Ответ 5

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

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

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

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

Ответ 6

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

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