LSformRule_zxcvbn: add minGuessesLog10, banPersonalInfo & banDictionaries parameters

This commit is contained in:
Benjamin Renard 2024-11-20 20:06:01 +01:00
parent fee03668f5
commit b7a68f6a9e
Signed by: bn8
GPG key ID: 3E2E1CE1907115BC
2 changed files with 63 additions and 5 deletions

View file

@ -13,8 +13,15 @@ guider dans le choix d'un mot de passe sûre.
- `minScore`
Le score minimal pour que le mot de passe soit accepté. Il doit s'agir d'un entier cimpris entre 0
(le plus faible) et 4 (le plus sécurisé). Paramètre facultatif valant 4 par défaut.
Le score minimal pour que le mot de passe soit accepté. Il doit s'agir d'un entier compris entre
0 (le plus faible) et 4 (le plus sécurisé). Paramètre facultatif valant 4 par défaut.
- `minGuessesLog10`
Permet de définir le logarithme en base 10 du nombre minimum estimé de tentative pour deviner le
mot de passe. Par exemple, si `minGuessesLog10` est égal à 6, cela signifie que le mot de passe
ne sera accepté que si `Zxcvbn` estime qu'il faut au moins 1 million (10^6) de tentatives pour le
deviner. Paramètre facultatif valant 10 par défaut.
- `userDataAttrs`
@ -24,6 +31,11 @@ guider dans le choix d'un mot de passe sûre.
le protège que peut des attaques ciblées. Paramètre facultatif, mais il est fortement conseillé de
renseigner un maximum d'attributs contenant des informations personnelles relatives à l'utilisteur.
- `banPersonalInfo`
Booléen permettant d'interdire toutes utilisations d'informations personnelles dans le choix du mot
de passe. Paramètre facultatif et vrai par défaut.
- `showWarning`
Booléen définissant si les messages d'alertes retournés par la librairie `Zxcvbn` doivent être
@ -52,6 +64,29 @@ guider dans le choix d'un mot de passe sûre.
}
```
- `banDictionaries`
Ce paramètre permet d'interdire tous mots issues de certains dictionnaires. Il s'agit d'un
tableau devant contenir les noms des dictionaires interdits. La librairie `Zxcvbn` fournis
les dictionnaires suivant :
- `us_tv_and_film` : les mots les plus courrament utilisés dans les séries et films américains
- `passwords` : les mot de passse les plus courrament utilisés
- `male_names` : les prénoms masculins les plus courrant
- `female_names` : les prénoms féminins les plus courrant
- `surnames` : les nom de familles les plus courrant aux États Unis
- `english_wikipedia` : les mots les plus courrament utilisés dans les articles en anglais de
Wikipédia
- `french_wikipedia` : les mots les plus courrament utilisés dans les articles en français de
Wikipédia
- `user_inputs` : les informations personnelles fournis lors de la validation du mot de passe
__Note :__ lister ce dictionnaire dans se paramètre à le même effet que le paramètre
`banPersonalInfo` documenté ci-dessus.
Vous pouvez également lister ici tout dictionnaires personnalisés que vous auriez ajouté grâce
au paramètre `customDictionaries`.
- `zxcvbn_autoload_path`
Le chemin vers le fichier de chargement automatique des classes de la librairie *ZxcvbnPhp*. Ce

View file

@ -30,7 +30,10 @@ class LSformRule_zxcvbn extends LSformRule {
// CLI parameters autocompleters
protected static $cli_params_autocompleters = array(
'minScore' => array('LScli', 'autocomplete_int'),
'minGuessesLog10' => array('LScli', 'autocomplete_int'),
'userDataAttrs' => null,
'banPersonalInfo' => array('LScli', 'autocomplete_bool'),
'banDictionaries' => null,
'showWarning' => array('LScli', 'autocomplete_bool'),
'showSuggestions' => array('LScli', 'autocomplete_bool'),
'customDictionaries' => null,
@ -82,13 +85,31 @@ class LSformRule_zxcvbn extends LSformRule {
}
self :: log_trace("User data: ".varDump($userData));
$result = $zxcvbn->passwordStrength($value, $userData);
self :: log_trace("Zxcvbn result: ".varDump($result));
self :: log_debug("Zxcvbn result: ".varDump($result));
self :: log_debug("Zxcvbn score: ".$result['score']);
self :: log_debug("Zxcvbn guesses log10: ".$result['guesses_log10']);
$minScore = LSconfig :: get('params.minScore', 4, 'int', $options);
if($result['score'] >= $minScore) {
return True;
$minGuessesLog10 = LSconfig :: get('params.minGuessesLog10', 10, 'int', $options);
$banDictionaries = LSconfig :: get('params.banDictionaries', [], 'array', $options);
if (LSconfig :: get('params.banPersonalInfo', true, 'bool', $options))
$banDictionaries[] = "user_inputs";
$banned_tokens = [];
if ($banDictionaries) {
foreach($result["sequence"] as $match) {
if ($match->pattern == "dictionary" && in_array($match->dictionaryName, $banDictionaries))
$banned_tokens[] = $match->token;
}
self :: log_debug("Zxcvbn banned token(s) found: '".implode("', '", $banned_tokens)."'");
}
if(
$result['score'] >= $minScore
&& $result['guesses_log10'] >= $minGuessesLog10
&& !$banned_tokens
)
return True;
$errors = array();
if (
@ -97,6 +118,8 @@ class LSformRule_zxcvbn extends LSformRule {
) {
$errors[] = $result['feedback']['warning'];
}
if ($banned_tokens)
$errors[] = _("Banned token found in this password.");
if (!$errors)
$errors[] = _('The security of this password is too weak.');