Hallo,
Ik ben begonnen met een LOI-cursus PHP (Waarom? Tijd te vullen)
Maar ik snap de opdracht niet heel goed.

Kopieer oefenopgave 10-1 en breid deze uit zodat er wachtwoorden worden gegenereerd van acht karakters lang waarin minimaal een hoofdletter, een cijfer, een kleine letter en een teken voorkomt. De tekens waaruit gekozen kan worden, zijn: !@#$%^&*(){}[]?. De verschillende onderdelen van het wachtwoord mogen niet op vaste posities worden geplaatst, dus het is niet de bedoeling dat er bv. altijd op positie 2 een getal staat.

Tip: Zoek op www.php.net bij de string functions naar een functie om de karakters in een string door elkaar te gooien.



<?php
function random_char($string)
{
  $length = strlen($string);
  $position = mt_rand(0, $length - 1);
  return($string[$position]);
}
function random_string ($charset_string, $length)
{
    $return_string = ''; // the empty string
  for ($x = 0; $x < $length; $x++)
    $return_string .= random_char($charset_string);
  return($return_string);
}

mt_srand((double)microtime() * 1000000);
$charset = 'abcdefghijklmnopqrstuvwxyz';
$random_string = random_string($charset, 8);
print('random_string: '.$random_string.'<br />');
$random_string = random_string($charset, 8);
print('random_string: '.$random_string.'<br />');
$random_string = random_string($charset, 8);
print('random_string: '.$random_string.'<br />');
?>


En ik weet dat ze best achterlopen, maar waar ik aan begonnen ben maak ik maar af ook.

Groetjes Alex.
Wat begrijp je niet heel goed?

Probeer voor jezelf te vertalen wat husselen in het amerikaans engels zou zijn. Bijv. shuffle of zo iets.

Om z'n functie dan te vinden typ je in google in <scripttaal> <zoekwoord> dus in ons geval: [google]php shuffle string[/google] En tadaa: daar krijgen we ons antwoord [php]str_shuffle[/php]

En andere manier is om in de string functie's van php.net te gaan zoeken opzoek naar iets wat met shuffle te maken heeft.
Dat snap ik wel, maar hoe weet je zeker dat niet alles op de dubbel op dezelfde plek komt te staan?
De kunst is éérst voldoen aan de strenge minimumvereisten en daarna aan de vereisten die je meer vrijheid bieden.


<?php
ini_set('display_errors', 'On');
error_reporting(E_ALL | E_STRICT);

// Voor tests
for ($i = 1; $i <= 100; $i++) {
    echo '<pre>', getRandomPassword();
}
        
/**
 * @param void
 * @return string
 */
function getRandomPassword()
{
    // Eerste vereiste: minimaal één hoofdletter A t/m Z (ASCII 65 t/m 90)
    $str = chr(mt_rand(65, 90));
    // Tweede vereiste: minimaal één kleine letter a t/m z (ASCII 97 t/m 122)
    $str .= chr(mt_rand(97, 122));
    // Derde vereiste: minimaal één cijfer 0 t/m 9
    $str .= mt_rand(0, 9);
    // Vierde vereiste: minimaal één karakter uit !@#$%^&*(){}[]?
    $str .= substr(str_shuffle('!@#$%^&*(){}[]?'), 0, 1);

    // Hierna vier karakters uit alle toegestane karakters
    $toegestaan = '0123456789'
                . 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
                . 'abcdefghijklmnopqrstuvwxyz'
                . '!@#$%^&*(){}[]?';
    $str .= substr(str_shuffle($toegestaan), 0, 4);

    // Tot slot alles nog eens husselen voor een onvoorspelbare positie
    $str = str_shuffle($str);

    // Resultaat retourneren
    return $str;
}
?>


Met een onvoorspelbare wachtwoordlengte wordt de functie overigens nog vele malen sterker.
Een ietswat andere variant. Die van Ward is gok ik een stuk effectiever maar het is maar om te laten zien dat het ook anders kan.

<?php

function my_password($password = ''){

# De lijst met alle mogelijke karakters voor in het wachtwoord.

$options = array(

'characters' => array('!' ,'@', '#', '$' ,'&' ,'^', '&', '*', '(', ')' ,'{', '}', '[', ']' ,'?'),

'numbers' => range(0, 9),

'lower' => range('a', 'z'),

'upper' => range('A', 'Z')

);


# Dan gaan we er nu eerst voor zorgen dat we aan de minimum eisen van een wachtwoord voldoen.

foreach($options as $set){

$password .= $set[array_rand($set)];
}


# De resterende 4 karakters toevoegen aan het wachtwoord.

for($i = 0; $i < 4; $i++){

# Een willekeurig set kiezen.

$set = array_rand($options);


# Een willekeurig karakter uit het set kiezen en toevoegen aan het wachtwoord.

$password .= $options[$set][array_rand($options[$set])];

}


# Wachtwoord shuffelen en terug geven.

return str_shuffle($password);

}

echo my_password();

?>

Reageren