From b7a68f6a9e7ab2e7af97c62e045ccff446da373e Mon Sep 17 00:00:00 2001 From: Benjamin Renard Date: Wed, 20 Nov 2024 20:06:01 +0100 Subject: [PATCH] LSformRule_zxcvbn: add minGuessesLog10, banPersonalInfo & banDictionaries parameters --- .../LSobject/LSattribute/check_data/zxcvbn.md | 39 ++++++++++++++++++- .../class/class.LSformRule_zxcvbn.php | 29 ++++++++++++-- 2 files changed, 63 insertions(+), 5 deletions(-) diff --git a/doc/src/conf/LSobject/LSattribute/check_data/zxcvbn.md b/doc/src/conf/LSobject/LSattribute/check_data/zxcvbn.md index e2cdbc70..37cba984 100644 --- a/doc/src/conf/LSobject/LSattribute/check_data/zxcvbn.md +++ b/doc/src/conf/LSobject/LSattribute/check_data/zxcvbn.md @@ -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 diff --git a/src/includes/class/class.LSformRule_zxcvbn.php b/src/includes/class/class.LSformRule_zxcvbn.php index 0272f6f2..422de308 100644 --- a/src/includes/class/class.LSformRule_zxcvbn.php +++ b/src/includes/class/class.LSformRule_zxcvbn.php @@ -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,14 +85,32 @@ 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 ( $result['feedback']['warning'] && @@ -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.');