Jump to content

Recommended Posts

Posted

Boas pessoal tenho este código para me verificar a pass e o programa diz-me se é fraca ou forte o problema é que os regex não estão a funcionar.

O sem os regex ele aceita me pass estupidas como "wwwwwwwwwwww" e diz-me que é forte   

public enum PasswordScore
    {
        Weak = 7,
        Medium = 10,
        Strong = 15,
    }

     public static PasswordScore CheckStrength(string password)
        {
            int score = 1;
            if (password.Length > 16)
                Console.WriteLine("Ultrapassou o limite");
            
            if (password.Length < 7)
                    return PasswordScore.Weak;
            else if (password.Length < 10)
                return PasswordScore.Medium;
            else if (password.Length < 15)
                return PasswordScore.Strong;
            
           if (password.Length >= 8)
                score++;
           if (password.Length >= 11)
                score++;
              
           if (Regex.IsMatch(password, @"^.*(?=.*[a-z]).*$", RegexOptions.ECMAScript))
                  score++;
           if (Regex.IsMatch(password, @"^.*(?=.{7,})(?=.*[a-z])(?=.*[A-Z]).*$", RegexOptions.ECMAScript))
               score++;

           if (Regex.IsMatch(password, @"^.*(?=.{7,})(?=.*[a-z])(?=.*[A-Z])(?=.*[\d\W]).*$", RegexOptions.ECMAScript)) //&&  Regex.IsMatch(password, @"/[A-Z]/", RegexOptions.ECMAScript))  
               score++;

           if (password.Length >= 15)
               MessageBox.Show("Ultrapassou");

}

private void npassTB_TextChanged(object sender, EventArgs e)
{
            PasswordScore score = CheckStrength(npassTB.Text);
            Int32 i = (Int32)score;

           if (i >= 16)
                MessageBox.Show("Ultrapassou o limite");
           else if (i <= 7)
               lblpassword.ForeColor = Color.Yellow;
           else if (i <= 10)
               lblpassword.ForeColor = Color.Green;
           else
               lblpassword.ForeColor = Color.Red;
           lblpassword.Text = score.ToString();
            
}
Posted

Ele nunca vai ultrapassar o trecho abaixo, pois você está simplesmente avaliando o tamanho da string e retornando um valor. Não chega a executar os regex. Você precisa modificar para ele não dar return já neste trecho.

     public static PasswordScore CheckStrength(string password)
        {
            int score = 1;
            if (password.Length > 16)
                Console.WriteLine("Ultrapassou o limite");
           
            if (password.Length < 7)
                    return PasswordScore.Weak;
            else if (password.Length < 10)
                return PasswordScore.Medium;
            else if (password.Length < 15)
                return PasswordScore.Strong;
// Qualquer coisa que aconteca a partir de aqui não vai ser verificado a não ser que a senha tenha mais de 15 caracteres, pois em todos os outros casos ele já retorna um valor no trecho acima e portanto termina a execução de método.

Fernando Lage Bastos - MCP/MCTS/MCPD

Posted

Com base no que disses-te coloquei assim

 if (password.Length >= 15)
                MessageBox.Show("Ultrapassou");
           else if (Regex.IsMatch(password, @"^.*(?=.*[a-z]).*$", RegexOptions.ECMAScript))
               return PasswordScore.Weak;
           else if (Regex.IsMatch(password, @"^\W*(?=\W*\D)[a-z])(?=\w*[A-Z])\w*$", RegexOptions.ECMAScript))
               return PasswordScore.Medium;
           else if (Regex.IsMatch(password, @"^.*(?=.{7,})(?=.*[a-z])(?=.*[A-Z])(?=.*[\d\W]).*$", RegexOptions.ECMAScript)) //&&  Regex.IsMatch(password, @"/[A-Z]/", RegexOptions.ECMAScript))  
               return PasswordScore.Strong;

Fazendo assim dá-me sempre como Weak se a pass começar por letras minusculas se começar por maiusculas ou numeros ou escriver uma letra e apagar dá erro no segundo regex parsing "^\W*(?=\W*\D)[a-z])(?=\w*[A-Z])\w*$" - Too many )'s.

Experimentei o score++ nos if onde estava a fazer os return e o resultado é o mesmo

Posted

quanto a este erro:

"^\W*(?=\W*\D)[a-z])(?=\w*[A-Z])\w*$" - Too many )'s. é isto mesmo que ele está falando, existe um ")" a mais nesta expressão. Precisa ver a fonte ou as regras que está usando e corrigí-la.

Quanto a expressão dar sempre a mais fraca, alterne a ordem de comparação para ficar algo assim:

  else if (Regex.IsMatch(password, @"^.*(?=.{7,})(?=.*[a-z])(?=.*[A-Z])(?=.*[\d\W]).*$", RegexOptions.ECMAScript)) //&&  Regex.IsMatch(password, @"/[A-Z]/", RegexOptions.ECMAScript)) 
               return PasswordScore.Strong;

  else if (Regex.IsMatch(password, @"^\W*(?=\W*\D)[a-z])(?=\w*[A-Z])\w*$", RegexOptions.ECMAScript))
               return PasswordScore.Medium;
         
else if (Regex.IsMatch(password, @"^.*(?=.*[a-z]).*$", RegexOptions.ECMAScript))
               return PasswordScore.Weak;

Pois o que está acontecendo é que a expressão da senha mais fraca é mais inclusiva, então uma senha forte por exemplo, também passa no teste para uma senha fraca. Se você alterar a ordem de comparação da forma como falei, ele vai comparando do padrão mais estrito para o mais fraco e retorna o padrão mais estrito que a senha entrada passar no teste do IsMatch.

Fernando Lage Bastos - MCP/MCTS/MCPD

Posted (edited)

Na textbox tenho este código será aqui o problema

private void npassTB_TextChanged(object sender, EventArgs e)
	{
		PasswordScore score = CheckStrength(npassTB.Text);
		Int32 i = (Int32)score;

	   if (i <= 7)

			lblpassword.ForeColor = Color.Yellow;
	   else if (i <= 10)
			lblpassword.ForeColor = Color.Green;
	   else //if (i == 15)
			lblpassword.ForeColor = Color.Red;
			lblpassword.Text = score.ToString();
	}

Fazendo como disses;te a label fica com um 1 e a amarelo por nao ser feito o score++

andei a fazer uma pesquisa e agora o código ficou assim já experimentei trocar o o primeiro else com o ultimo e é igual

if (password.Length >= 16)
			MessageBox.Show("Ultrapassou");

else if (Regex.IsMatch(password, @".[a-z]\d+[!,@,#,$,%,^,&,*,?,_,~,-,£,(,)]/", RegexOptions.ECMAScript))  
			return PasswordScore.Strong;

		else if (Regex.IsMatch(password, @"/[a-z]\d+/", RegexOptions.ECMAScript))
			return PasswordScore.Medium;

		else if (Regex.IsMatch(password, @"/[a-z]/", RegexOptions.ECMAScript))
			return PasswordScore.Weak;
Edited by gregurs
GeSHi
Posted (edited)

é só adicionar o score entre as linhas que ficou faltando

ex: no seu código original você tinha isso, pode deixar igual e abaixo eu modifiquei para atualizar o score.

if (password.Length >= 8)
			score++;
	   if (password.Length >= 11)
			score++;
	   //Aqui comeca a modificacao
	   PasswordScore score=PasswordScore.Weak;
}
if (password.Length >= 16)
							MessageBox.Show("Ultrapassou");
else if (Regex.IsMatch(password, @".[a-z]\d+[!,@,#,$,%,^,&,*,?,_,~,-,£,(,)]/", RegexOptions.ECMAScript))  
{
    score+3;
   score= PasswordScore.Strong;
}
  else if (Regex.IsMatch(password, @"/[a-z]\d+/", RegexOptions.ECMAScript))
{							  score+2;
							 score= PasswordScore.Medium;
}
 else if (Regex.IsMatch(password, @"/[a-z]/", RegexOptions.ECMAScript))
{
   score+1;
}
lblpassword.Text = score.ToString();
return  score;
Edited by petvetbr

Fernando Lage Bastos - MCP/MCTS/MCPD

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.