gregurs Posted May 9, 2012 at 09:46 PM Report #454180 Posted May 9, 2012 at 09:46 PM 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(); }
petvetbr Posted May 9, 2012 at 10:11 PM Report #454187 Posted May 9, 2012 at 10:11 PM 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
gregurs Posted May 9, 2012 at 10:46 PM Author Report #454192 Posted May 9, 2012 at 10:46 PM 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
petvetbr Posted May 9, 2012 at 11:30 PM Report #454195 Posted May 9, 2012 at 11:30 PM 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
gregurs Posted May 13, 2012 at 04:06 PM Author Report #455046 Posted May 13, 2012 at 04:06 PM (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 May 13, 2012 at 08:32 PM by gregurs GeSHi
petvetbr Posted May 14, 2012 at 12:03 AM Report #455295 Posted May 14, 2012 at 12:03 AM (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 May 14, 2012 at 12:08 AM by petvetbr Fernando Lage Bastos - MCP/MCTS/MCPD
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now