Фильтр preg_replace для паролей - PullRequest
10 голосов
/ 28 июня 2009

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

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

EDIT:

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

Ответы [ 6 ]

19 голосов
/ 29 июня 2009

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

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

10 голосов
/ 28 июня 2009

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

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

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

4 голосов
/ 28 июня 2009

Вот, пожалуйста:

^[ -~]+$

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

^[ -~]*$

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

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

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

1 голос
/ 03 июля 2009

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

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

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

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

1 голос
/ 29 июня 2009

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

0 голосов
/ 28 июня 2009

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

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

...