Pergunta

Com PHP, eu gostaria de usar um filtro preg_replace () para senhas de tal forma que os únicos personagens disponíveis para senhas são US ASCII tipáveis, menos códigos de controle e NULL.

Qual é a RegEx para conseguir o que eu posso o plugin para preg_replace ()?

EDIT:

Eu tenho aconselhado a editar esta questão desde que eu "pegar" agora e não vai fazer esta técnica terrivelmente impopular e permitirá que qualquer personagem tipável mesmo aqueles que podem não ter no meu teclado, apenas contanto que eles não são controlar códigos.

Foi útil?

Solução

Como já foi dito, não restringir o conjunto de caracteres que são permitidos em senhas. Só porque o teclado não tiver a, a, ou O nele há nenhuma razão para parar aqueles de nós que têm-los (ou sabe como escrevê-los de qualquer forma) de usar essas cartas. Você vai estar armazenando a senha como um hash criptográfico de qualquer forma (ou pelo menos como uma string encriptada), não é? Se sim, então não importa se o seu banco de dados pode com sucesso / armazenar com segurança os caracteres reais a senha de qualquer forma, apenas a saída personagens pelo seu algoritmo de criptografia. (E se não, em seguida, armazenar senhas em texto simples é uma muito problema maior do que personagens as senhas podem ou não conter - não faça isso)

A sua aparente intenção de impor suas restrições de conjunto de caracteres por silenciosamente tirando os caracteres que você não gosta em vez de dizer ao usuário "Tente novamente e, desta vez, use apenas estes caracteres:. A, e, i, o, u" faz o seu método proposto verdadeiramente atroz, porque significa que se eu tentar usar, digamos, a fäîry senha (não incrivelmente segura, mas deve manter-se contra ataques de dicionário leves), minha senha real, desconhecido para mim, será fry (se sua senha é uma palavra de três letras, em linha reta fora do dicionário e de uso comum, assim como você pode nem sequer se preocupar). Ouch!

Outras dicas

Pessoalmente, eu sempre achei altamente perturbador quando um site ou serviço tentou me forçar a usar senhas que seguem uma certa limitação (geralmente completamente estúpido).

Não é todo o ponto de senhas que eles não são muito fácil adivinhação? Por que você quer que eles sejam menos complexos do que os seus utilizadores quer que eles sejam? Eu não posso imaginar uma limitação técnica que exigiria o uso de "ASCII apenas" para senhas.

Permita que os usuários usar qualquer senha que eles gostam, mistura-los e armazená-los como cordas Base64. Estes são ASCII somente.

Aqui vai:

^[ -~]+$

supondo que você não deseja senhas vazias; caso contrário é:

^[ -~]*$

para permitir que as vazias.

Eu não sei por que você está perguntando sobre preg_replace - Eu seria cauteloso de manipular a senhas que tipo de pessoas. Melhor para fazer cumprir a regra que só aceitam ASCII imprimíveis, e dizer ao usuário se eles quebram essa regra (ou, como já foi dito, para não ter quaisquer regras, mas eu suponho que você tem razões para eles).

Se você está pensando de remover silenciosamente os caracteres que não correspondem, e alguém vem junto com uma senha de Úéåæ, então você estará armazenando uma senha em branco para eles sem seu conhecimento.

Por favor, não filtrar suas senhas de usuários. Que derrota um lote inteiro do ponto. Eu escrevi mais sobre isso aqui: http://www.evanfosmark.com/2009/06/why-do-so-many-websites-fail-with-password-restrictions/

Eu discordo que não há nenhuma razão para rejeitar caracteres não-ascii, embora cabe a você decidir se os prós superam os contras.

Se você permitir caracteres não-ascii, então você está no fato de cometer corretamente Internacionalizar a parte da sua aplicação web. Para muitas aplicações, a internacionalização é uma reflexão tardia. Para aplicações web, que é uma questão muito não-trivial.

Se você não controlar explicitamente a codificação de caracteres quando você vai entre caracteres e bytes, então você está basicamente contando com o que quer que os padrões que ser para sua implantação. Se sua configuração nunca muda (por exemplo, a migração do Windows para o Linux, ou mudar para outro servidor web), então seus padrões têm uma boa chance de mudar de debaixo de ti, e em seguida, os caracteres não-ascii serializará a uma sequência de bytes diferente. Então, de repente, os hashes de pessoas usando-os em suas senhas não coincidir com o que está no banco de dados, e eles vão ficar trancado para fora de suas contas.

Eu, é claro, concorda que é completamente inaceitável para apenas filtrar aqueles personagens; você tem que aceitar um ou rejeitar a senha.

/ [\ p {Cc}] / para obter caracteres de controle (acho que isso cobre 0-31)

Eu concordo com Richie. Use preg_match em vez de preg_replace.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top