webForumDet fria alternativet

Lösenordskontroll

.NETur .NET

21 svar · 1 716 visningar · startad av MickeA.com

Medlem sedan feb. 20034 441 inlägg
Frågan#1

Tjena,

Jag måste bygga om vår kontroll av lösenord och det måste från och med nu följa detta mönster:

The password length is 4-14 characters and we only allow numbers and letters, no special characters, symbols, spaces or punctuation marks

Jag är så fruktansvärt kass på regexp, så skulle bli glad för lite hjälp med det här.

Tack!

Medlem sedan dec. 20025 483 inlägg
#2
if (!Regex.IsMatch(inputString, @"^[a-z0-9]{4,14}$", RegexOptions.IgnoreCase))
{
  // no match
}
Medlem sedan feb. 20034 441 inlägg
#3

Tack!

Medlem sedan feb. 20034 441 inlägg
#4

Om jag vill pimpa det ovan och kräva t.ex. att lösenordet måste börja på en siffra och sluta på en stor bokstav, eller låt säg att det minst måste innehålla två siffror och tre stora bokstäver, hur ska det se ut då?

Medlem sedan dec. 20025 483 inlägg
#5

Om lösenordet innehåller färre än 2 siffror eller färre än 3 versaler:

if (inputString.Length < 4 || inputString.Length > 14
    || Regex.Matches(inputString, @"\d").Count < 2 || Regex.Matches(inputString, @"[A-Z]").Count < 3)
{
  // error
}
Medlem sedan feb. 20034 441 inlägg
#6

Bör något sånt här funka?

String login = uif.GetString("login");
String passwd = uif.GetString("password");
if(!String.IsNullOrEmpty(login) || !String.IsNullOrEmpty(passwd)){
	Regex validateLogin  = new Regex(@"\A(?![a-zA-Z0-9_.\-]*? {2,})[a-zA-Z0-9_.\-]{2,12}\z");
	Regex validatePasswd = new Regex(@"^[a-z0-9]{4,14}$");
	if(!validateLogin.IsMatch(login)){
		errorLbl.Text = Res.GetString("login_mismatch").Replace("%LOGIN%", login);
		errorPanel.Visible = true;
		return;

	}else if(validatePasswd.IsMatch(passwd)){
		errorLbl.Text = "Password doesn't match the pattern.";
		errorPanel.Visible = true;
		return;

	}else if(Regex.Matches(passwd, @"\d").Count < 2 || Regex.Matches(passwd, @"[A-Z]").Count < 3){
		errorLbl.Text = "The password must contain at least 2 digits and 3 CAPITAL letters.";
		errorPanel.Visible = true;
		return;
	}
}
Medlem sedan dec. 20025 483 inlägg
#7

Om du ändrar till:

Regex validatePasswd = new Regex(@"^[a-z0-9]{4,14}$", RegexOptions.IgnoreCase);
Medlem sedan feb. 20034 441 inlägg
#8

Vad innebär IgnoreCase i det här fallet? För våra lösenord är shiftlägeskänsliga. Kommer det att påverka valideringen på något sätt?

Medlem sedan dec. 20025 483 inlägg
#9

Det innebär att den andra if-satsen kommer att tillåta lösenord som innehåller gemener, versaler och siffror istället för bara gemener och siffror.

Om IgnoreCase inte tas med kommer alla lösenord som innehåller versaler att rapporteras som ogiltiga. Alternativet till att ta med IgnoreCase är att använda [a-zA-Z0-9].

Medlem sedan feb. 20034 441 inlägg
#10

Okej, tack!

Medlem sedan dec. 19995 875 inlägg
#11

Peter S skrev:

Om IgnoreCase inte tas med kommer alla lösenord som innehåller versaler att rapporteras som ogiltiga. Alternativet till att ta med IgnoreCase är att använda [a-zA-Z0-9].

Det innebär väl också att det inte spelar någon roll om man skickar in en versal eller gemen, vilket gör lösenordskontrollen sämre?

Om jag vill pimpa det ovan och kräva t.ex. att lösenordet måste börja på en siffra och sluta på en stor bokstav, eller låt säg att det minst måste innehålla två siffror och tre stora bokstäver, hur ska det se ut då?

Angående lösenord så kan man använda "titta framför" i regex för att uppnå det du vill. Jag har skrivit lite om det här http://patrikc.wordpress.com/2009/06/01/avancerade-reguljara-uttryck/

I ditt exempel skulle man kunna skriva såhär:

^((?=(.*\d){2})(?=.*[a-z])(?=(.*[A-Z]){3}).{4,14})$

(?=(.*\d){2}) - talar om att det måste finnas minst två siffror.
(?=.*[a-z]) - talar om att det måste finnas minst en liten bokstav
(?=(.*[A-Z]){3}) - talar om att det måste finnas minst tre stora bokstäver
.{4,14} - talar om att vilka tecken som helst får förekomma mellan 4 och 14 gånger. Detta kan du ändra till [a-zA-Z0-9] om du vill begränsa lösenordet till endast dessa tecken.

Jag avråder dig från att skapa en lösenordskontroll som bygger på att man måste börja sitt lösenord med en siffra och avsluta med en versal. Detta eftersom man då hjälper en hacker i sitt arbete att knäcka lösenord. Det bästa är att låta användaren välja från ett stort urval och precis som du söker, tvinga han att kombinera sitt lösenord så det består av många olika tecken.

Men som exempel kan det se ut såhär

^[0-9].{2,12}[A-Z]$

Alternativt återigen, byta ut . mot [a-zA-Z0-9].

Medlem sedan feb. 20034 441 inlägg
#12

Tack för infon. Nu gjorde vi så att vi kräver inga speciella "mönster", t.ex. att det måste börja med en siffra. Däremot gjorde jag så att vi kräver minst en siffra, någonstans i lösenordet.

Medlem sedan feb. 20034 441 inlägg
#13

Nu håller jag på att bli galen på den här kodsnutten:

Regex validateName   = new Regex(@"^[a-z]$", RegexOptions.IgnoreCase);

Varför tillåter den inte att jag fyller i "Micke" eller "micke" som namn?

if(!validateName.IsMatch(fname)){
   errorLbl.Text = Res.GetString("name_mismatch").Replace("%FIELD%", f_fname);
   errorPanel.Visible = true;
   return;
}

Vill även ha med - i mitt mönster, men får samma fel när jag testar @"^[a-z\-]$"

Vad är problemet?

Tack!

Medlem sedan juni 20019 519 inlägg
#14

^[a-z]$
säger:
^ = träff i börja av strängen
[a-z] = träffar 1 av följande tecken a-z
$ = träff i slutet av en sträng.

^[a-z]+$

behöver du nog köra + = 1 till hur många träffar som helst.

Medlem sedan feb. 20034 441 inlägg
#15

Tack ska du ha!
Jag har försökt bli kompis med RegExp i tre år nu men det är mest bråk och tjafs jämt tycker jag. Kanske dags att ge upp? Haha..

Medlem sedan juni 20019 519 inlägg
#16

Tycker jag inte!

Tyvärr kommer jag göra lite reklam nu men: RegExBuddy är ett av mina bättre köp och är ett underbart program att få ut regex kod i en del språk + kan enkelt se förklaring på dina koder, de släppte även en ny regex applikation för inte så länge sen.

Medlem sedan feb. 20034 441 inlägg
#17

voigtann1 skrev:

...RegExBuddy är ett av mina bättre köp och är ett underbart program att få ut regex kod i en del språk + kan enkelt se förklaring på dina koder, de släppte även en ny regex applikation för inte så länge sen.

Det här ser riktigt bra ut! Blir till att köpa pronto. Tack för tipset!

Medlem sedan dec. 19995 875 inlägg
#18

Jag håller med regexbuddy är ett väldigt bra verktyg för att skapa och testa sina regex, så det förtjänar lite reklam :)

Det andra verktyget som voigtann1 pratar om är regexmagic som skapar ett regex baserat på den text du matar in. Jag har dessvärre inte provat det.

Medlem sedan juni 20019 519 inlägg
#19

Fundera på att köpa det, fast jag vet inte riktigt om jag har någon nytta med det, fast hade varit trevligt att se hur "bra" mönster den skapar.

Medlem sedan apr. 20007 588 inlägg
#20

Hyffsat kassa krav för ett lösenord. Ett fyra tecken långt lösenord som bara innehåller alfanumeriska tecken bruteforce-knäcker man ju på sekunder...

135 ms totalt · 3 externa anrop · v20260731065814-full.4bcf49fe
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
132 ms — hämta tråd, inlägg och bilagor (db)