[php] string controleren: min. 2 letters en 2 cijfers?

Pagina: 1
Acties:
  • 308 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Euj iedereen!

Ik ben bezig met een password-scriptje in php, en daarin wil ik controleren of de gebruiker wel een password instelt waarin minimaal 2 letters en 2 cijfers voorkomen (dit ivm veiligheid)

Nu vraag ik me af: hoe controleer ik dit in php? Met dingen als strcount kun je volgens mij alleen maar een bepaald karakter tellen, en niet soorten karakters (cijfers/letters)

Weet iemand hier een oplossing voor?

Acties:
  • 0 Henk 'm!

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 20:28

Robtimus

me Robtimus no like you

Moeilijke manier: tel van elk cijfer en van elke letter de individuele voorkomens, en tel die dan bij elkaar op. Nadeel: worst case (je kan escapen zodra je al aan je eisen hebt voldaan) ben je 10 + 26 + 26 keer bezig.

Kun je niet counten op reguliere expressies ([0-9], [a-zA-Z])?

More than meets the eye
There is no I in TEAM... but there is ME
system specs


Acties:
  • 0 Henk 'm!

  • DeverauX
  • Registratie: Februari 2002
  • Niet online

DeverauX

Focus is everything

Weet iemand hier een oplossing voor?
Het beste is gewoon gebruik te maken van reguliere expressies. (kijk even naar de functie preg_match )
Zie ook:
Regular Expression Functions

...whatever was distasteful or unpleasant or uncomfortable or painful - music could always soothe that.
All you have to do is reach out to beauty.
Quincy Jones


Acties:
  • 0 Henk 'm!

  • eborn
  • Registratie: April 2000
  • Laatst online: 19:03
Reguliere expressies werken hier volgens mij niet. Je geeft toch altijd een bepaalde expressie op, gevolgd door het aantal keer dat dit voor mag komen? In dit geval kunnen de cijfers en letters op willekeurige posities staan, dus kun je toch niet matchen?

* eborn gaat er nog eens even goed over nadenken ;)

Acties:
  • 0 Henk 'm!

  • chem
  • Registratie: Oktober 2000
  • Laatst online: 11-09 11:19

chem

Reist de wereld rond

http://www.php.net/manual/en/ref.crack.php is misschien een beter idee.

Klaar voor een nieuwe uitdaging.


Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 16:51
Ik zou gewoon op zoek gaan naar een controle voor een postcode en die ombakken ;)

Acties:
  • 0 Henk 'm!

  • x-force
  • Registratie: Maart 2001
  • Laatst online: 05-01-2024
ik roep maar effe wat hoor:
kan je elke letter apart niet 'casten' (omzetten) naar een int (ASCII) en dan kan je het zo checken??

ik weet dat dit met java enzo kan maar weet het niet hoe dit zit met php

VangenopBetaalwater.nl Het platform om ervaringen over betaalwater in Frankrijk te delen met andere karpervissers zodat iedereen kan vangen op betaalwater!


Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 16:51
Die link van Chem is trouwens echt voor dit soort zaken bedoeld, als het om de sterkte van een wachtwoord gaat. Die kun je beter gebruiken dan alle andere oplossingen die wij tot nu toe geroepen hebben. Je kunt dan echter niet zelf het formaat helemaal ebpalen.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Tsja... Maar voor die crack-functies heb je een speciale library nodig ofzo, en bovendien kan ik de gebruiker dan niet vertellen wat er precies fout of goed is aan zo'n password. Ik heb het zaakje dan niet meer in de hand, snap je?
Nog andere suggesties?

Acties:
  • 0 Henk 'm!

  • kvdveer
  • Registratie: November 2000
  • Laatst online: 07-11-2023

kvdveer

Z.O.Z.

Verwijderd schreef op 28 June 2003 @ 16:06:
Tsja... Maar voor die crack-functies heb je een speciale library nodig ofzo, en bovendien kan ik de gebruiker dan niet vertellen wat er precies fout of goed is aan zo'n password. Ik heb het zaakje dan niet meer in de hand, snap je?
Nog andere suggesties?
Je kunt de gebruiker exact vertellen wat er niet goed is aan het wachtwoord - dat staat namelijk in het laatste message.

De volgende regexpen kunnen misschien helpen: /[0-9].*[0-9]/ en /[a-z].*[a-z]/i
Ze controleren of er resp. twee cijfers inzitten en twee letters.

Localhost, sweet localhost


Acties:
  • 0 Henk 'm!

Verwijderd

Euh, zoiets:

ereg('[a-z0-9]{4,}', $tmp_password);

...? Of denk ik nu te simpel?

Edit: Iets te snel gelezen, zal even proberen wat anders te bedenken...

[ Voor 37% gewijzigd door Verwijderd op 28-06-2003 19:09 ]


Acties:
  • 0 Henk 'm!

  • kvdveer
  • Registratie: November 2000
  • Laatst online: 07-11-2023

kvdveer

Z.O.Z.

Verwijderd schreef op 28 juni 2003 @ 19:07:
Euh, zoiets:

ereg('[a-z0-9]{4,}', $tmp_password);

...? Of denk ik nu te simpel?

Edit: Iets te snel gelezen, zal even proberen wat anders te bedenken...
Hij wil controleren op twee onafhankelijke eigenschappen in een string. Slechts bij hoge uizondering kun je daarvoor een eenvoudige regexp verzinnen. Als hij nou wilde dat er òf twee cijfer òf twee letters in zaten was het hele andere koek: /([a-z].*[a-z])|([0-9].*[0-9])/i Maar helaas.

Met wat recente kennis van "automaten&talen" (een vak op de tudelft) krijg ik dit er uit:
/([a-z].*[a-z].*[0-9].*[0-9])|([a-z].*[0-9].*[a-z].*[0-9])|([a-z].*[0-9].*[0-9].*[a-z])|([0-9].*[a-z].*[a-z].*[0-9])|([0-9].*[a-z].*[0-9].*[a-z])|([0-9].*[0-9].*[a-z].*[a-z])/i

Localhost, sweet localhost


Acties:
  • 0 Henk 'm!

Verwijderd

kvdveer schreef op 28 June 2003 @ 19:24:
[...]
Hij wil controleren op twee onafhankelijke eigenschappen in een string. Slechts bij hoge uizondering kun je daarvoor een eenvoudige regexp verzinnen. Als hij nou wilde dat er òf twee cijfer òf twee letters in zaten was het hele andere koek: /([a-z].*[a-z])|([0-9].*[0-9])/i Maar helaas.

Met wat recente kennis van "automaten&talen" (een vak op de tudelft) krijg ik dit er uit:
/([a-z].*[a-z].*[0-9].*[0-9])|([a-z].*[0-9].*[a-z].*[0-9])|([a-z].*[0-9].*[0-9].*[a-z])|([0-9].*[a-z].*[a-z].*[0-9])|([0-9].*[a-z].*[0-9].*[a-z])|([0-9].*[0-9].*[a-z].*[a-z])/i
Makkelijk is of was het niet, maar zie hier mijn oplossing:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// password definieren
$pass = "adsf34";

// aantal expressie-checks doen
if (
   (ereg('[a-z]{2,}', $pass) OR ereg('[a-z]{1,}.+[a-z]{1,}', $pass)) AND
   (ereg('[0-9]{2,}', $pass) OR ereg('[0-9]{1,}.+[0-9]{1,}', $pass))
   )
   {
   echo "Dit password bevat minimaal twee cijfers en twee letters.";
   } else
      {
      echo "Dit password voldoet niet aan de eisen!";
      }


/me had zin om zich uit te sloven ;)

[ Voor 29% gewijzigd door Verwijderd op 28-06-2003 19:46 ]


Acties:
  • 0 Henk 'm!

  • kvdveer
  • Registratie: November 2000
  • Laatst online: 07-11-2023

kvdveer

Z.O.Z.

Verwijderd schreef op 28 June 2003 @ 19:40:
[...]


Makkelijk is of was het niet, maar zie hier mijn oplossing:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// password definieren
$pass = "adsf34";

// aantal expressie-checks doen
if (
   (ereg('[a-z]{2,}', $pass) OR ereg('[a-z]{1,}.+[a-z]{1,}', $pass)) AND
   (ereg('[0-9]{2,}', $pass) OR ereg('[0-9]{1,}.+[0-9]{1,}', $pass))
   )
   {
   echo "Dit password bevat minimaal twee cijfers en twee letters.";
   } else
      {
      echo "Dit password voldoet niet aan de eisen!";
      }


/me had zin om zich uit te sloven ;)
Met deze aanpak had je beter mijn oorspronkelijke regexp kunnen pakken:
PHP:
1
2
3
4
if(preg_match('/[0-9].*[0-9]/',$pass) && preg_match('/[a-z].*[a-z]/i',$pass))
  echo "ok";
else
  echo "Prutz0r";


Betere performance om twee redenen: minder regexpen en preg ipv ereg....

Localhost, sweet localhost


Acties:
  • 0 Henk 'm!

Verwijderd

kvdveer schreef op 28 juni 2003 @ 20:02:
[...]


Betere performance om twee redenen: minder regexpen en preg ipv ereg....
Ben niet bekend met preg. Feit is dat ze het allebei doen, dus de topic starter mag kiezen ;)

(Mijn versie zou nog verder geminimalisseerd kunnen worden, maar daar heb ik geen zin in).

[ Voor 15% gewijzigd door Verwijderd op 28-06-2003 20:06 ]


Acties:
  • 0 Henk 'm!

  • stekkel
  • Registratie: Augustus 2001
  • Laatst online: 17-09 08:05
Ik zou zoals ook al eerder voorgesteld een string iteratie doen:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$iAlphaRequired = 2;
$iNumericRequired = 2;
$iNum = $iChar = 0;
$password_strong = false;
$password = 'blah33';
$password_verify = strtoupper($password); // bespaard een extra range check voor a-z 
for ($i=0,$iCnt = strlen($password);$i<$iCnt;++$i) {
     $iOrd = ord($pasword_verify{$i});
     if ($iOrd>47 && $iOrd < 58) {  // 0-10
         ++$iNum;
     } else if  ($iOrd > 64 && $iOrd < $91) {  // A-Z
         ++$iChar;
     }
     if ($iChar >= $iAlphaRequired && $iNum >= $iNumericRequired) {
          $password_strong = true;
          break;
     }
}
if ($password_strong) {
    echo 'Jippie ik heb een goed password';
} else {
    echo 'Ja daag, ik ben niet achterlijk, ga eens wat beters verzinnen';
}


/uitsloofmodus

[ Voor 13% gewijzigd door stekkel op 29-06-2003 15:02 . Reden: doublequotes => singlequotes ]


Acties:
  • 0 Henk 'm!

Verwijderd

stekkel schreef op 29 June 2003 @ 14:49:
Ik zou zoals ook al eerder voorgesteld een string iteratie doen:
PHP:
1
stuk code


/uitsloofmodus
Maar waarom deze methode uitvoeren, de hierbovenstaande oplossingen zijn veel korter? Of is de preformance van dit script zo goed?

[ Voor 55% gewijzigd door Verwijderd op 29-06-2003 14:51 ]


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Verwijderd schreef op 29 juni 2003 @ 14:51:
Maar waarom deze methode uitvoeren, de hierbovenstaande oplossingen zijn veel korter? Of is de preformance van dit script zo goed?
Denk dat zijn code in principe flexibeler te maken is. Performanceverschil zal wel alleen meetbaar zijn als je een heel goede stopwatch hebt.

Acties:
  • 0 Henk 'm!

  • stekkel
  • Registratie: Augustus 2001
  • Laatst online: 17-09 08:05
Verwijderd schreef op 29 June 2003 @ 14:51:
[...]

Maar waarom deze methode uitvoeren, de hierbovenstaande oplossingen zijn veel korter? Of is de preformance van dit script zo goed?
Omdat het veel flexibeler is. Je kan zelf aanpassen hoeveel karakteres per soort vereist zijn. Daarnaast kan je natuurlijk ook ranges toevoegen zodat er bijvoorbeeld ook op speciale tekens gechecked wordt.

En uiteraard vindt ik het een leukere oplossing :)

Acties:
  • 0 Henk 'm!

  • stekkel
  • Registratie: Augustus 2001
  • Laatst online: 17-09 08:05
ACM schreef op 29 June 2003 @ 14:55:
[...]

Denk dat zijn code in principe flexibeler te maken is. Performanceverschil zal wel alleen meetbaar zijn als je een heel goede stopwatch hebt.
Snelheid is theoretisch hoger maar in de praktijk hebben we met php te maken dus dan valt het altijd weer vies tegen.

Aan de andere kant, snelheid is absoluut niet relevant in dit geval. Het wordt anders wanneer je 1000 passwords moet checken.

Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

stekkel schreef op 29 June 2003 @ 15:01:
Snelheid is theoretisch hoger maar in de praktijk hebben we met php te maken dus dan valt het altijd weer vies tegen.
Ik denk dat de snelheid ook in C(++) weinig hoger zal zijn hoor, de pcre-reglib is behoorlijk efficient.
Aan de andere kant, snelheid is absoluut niet relevant in dit geval. Het wordt anders wanneer je 1000 passwords moet checken.
Daarom, performance is imho bijna altijd een non-argument om een bepaald algoritme boven een andere te preferen als dat niet het enige/belangrijkste verschil is :)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Jongens, bedankt! Ik ga het zeer binnenkort testen, maar ik ben er van overtuigd dat dit gaat werken!
Pagina: 1