is115-php/modul2/index2_5.php

84 lines
3.0 KiB
PHP

<?php include '../common.php'; ?><!DOCTYPE html>
<html lang="no">
<head>
<title><?=title();?></title>
<link rel="stylesheet" href="../index.css">
</head>
<body>
<div class="container">
<h1><?=title();?></h1>
<h4><?=getNavigation();?></h4>
<h2>Passord-generator</h2>
<?php
/**
* @throws Exception
*/
function genPwd($len = 8): string {
// Liste over tegn som kan bli med i passordet.
$characterString = "abcdefghijklmnopqrstuvwxyzæøåABCDEFGHIJKLMNOPQRSTUVWXYZÆØÅ";
$numbers = "1234567890";
$special = "!#%&/()=?+*-:;";
// Converterer tegn-lista til en array av UTF-8 tegn. (Kan funke uten denne som tilfellene med tallene eller spesial-tegnene, men da støttes ikke UTF-8 (æøå))
$characters = preg_split('//u', $characterString, null, PREG_SPLIT_NO_EMPTY);
// Tellere så vi kan bekrefte at passordet inneholder minst ett av hver type.
$numCount = 0;
$speCount = 0;
$chaCount = 0;
// Prosent-sjangse for at nummer og spesial-tegn blir valgt som neste tegn i passordet.
$numChance = 30;
$specChance = 20;
$pwd = "";
// Løkke som går over hvert tegn av det nye passordet.
for($i = 0; $i < $len; $i++){
if($i==0){ $rand = 100; } // Sikre at første tegn er en bokstav.
else {
$rand = random_int(0,100);
}
// Hvis det tilfeldige tallet mellom 0 og 100 mindre enn $numChance, så blir dette tegnet et tall. Ellers hvis dette tallet er nest siste av passordet, så sjekkes det at det er med et tall. Hvis det ikke er et tall, skal det nå bli et tall.
if($rand < $numChance || $i == $len-2 && $numCount == 0){
$pwd .= $numbers[ random_int(1, strlen($numbers) )-1 ];
$numCount++;
}
// Hvis det tilfeldige tallet mellom 0 og 100 mindre enn $specChance, så blir dette tegnet et spesialtegn. Ellers hvis dette tegnet er siste i passordet, så sjekkes det at det er med et spesialtegn. Hvis det ikke er et spesialtegn, skal det nå bli et spesialtegn.
elseif($rand < $specChance+$numChance || $i == $len-1 && $speCount == 0){
$pwd .= $special[ random_int(1, strlen($special) )-1 ];
$speCount++;
}
// Ellers skriv en bokstav.
else {
$pwd .= $characters[ random_int(1, count($characters) )-1 ];
$chaCount++;
}
}
return $pwd;
}
$pwdLen = $_GET['pwdlen'] ?? 8;
?>
<p>
<?php
try {
echo "<strong>".genPwd($pwdLen)."</strong>";
} catch (Exception $e) {
echo "<i><strong>Feil!</strong> Kanskje en god kilde for tilfeldighet ble ikke funnet.</i><br></p><p>".$e;
}
?>
</p>
<form><p><input type="number" name="pwdlen" value="<?=$pwdLen;?>" min="8" max="42"><input type="submit" value="Generer nytt..."></p></form>
</div>
</body>
</html>