From db287937b7c397ba90b7abe73bb86c40bb36c1d4 Mon Sep 17 00:00:00 2001 From: Benjamin Renard Date: Thu, 16 Dec 2021 18:58:29 +0100 Subject: [PATCH] Add LSformRule_zxcvbn --- debian/control | 2 +- doc/conf/LSattribute/check-data.docbook | 1 + .../LSattribute-check_data.entities.xml | 1 + .../LSattribute/check_data/zxcvbn.docbook | 67 ++++++++++++ .../LSobjects/config.LSobjects.LSpeople.php | 14 +-- .../class/class.LSformRule_zxcvbn.php | 102 ++++++++++++++++++ 6 files changed, 175 insertions(+), 12 deletions(-) create mode 100644 doc/conf/LSattribute/check_data/zxcvbn.docbook create mode 100644 src/includes/class/class.LSformRule_zxcvbn.php diff --git a/debian/control b/debian/control index 3e710072..8257f0ba 100644 --- a/debian/control +++ b/debian/control @@ -7,7 +7,7 @@ Maintainer: Benjamin Renard Package: ldapsaisie Architecture: all Depends: apache2 | httpd, php-ldap | php5-ldap, php-fpm | libapache2-mod-php5 | libapache2-mod-php | php5-cli | php-cli, smarty | smarty3, php-net-ldap2, php-net-ftp, php-mail, php-mail-mime, php-console-table -Recommends: php-mbstring, php-phpseclib, php-unidecode +Recommends: php-mbstring, php-phpseclib, php-unidecode, php-zxcvbn Description: web based interface for managing LDAP servers content LdapSaisie is a Web application developed to manage LDAP directory. It has been written in PHP / JavaScript and is published under the diff --git a/doc/conf/LSattribute/check-data.docbook b/doc/conf/LSattribute/check-data.docbook index f349acf3..58f513f2 100644 --- a/doc/conf/LSattribute/check-data.docbook +++ b/doc/conf/LSattribute/check-data.docbook @@ -69,5 +69,6 @@ règles. &conf-LSattribute-check-data-required; &conf-LSattribute-check-data-ssh_pub_key; &conf-LSattribute-check-data-telephonenumber; +&conf-LSattribute-check-data-zxcvbn; diff --git a/doc/conf/LSattribute/check_data/LSattribute-check_data.entities.xml b/doc/conf/LSattribute/check_data/LSattribute-check_data.entities.xml index 17ebbb7c..6e52fcf7 100644 --- a/doc/conf/LSattribute/check_data/LSattribute-check_data.entities.xml +++ b/doc/conf/LSattribute/check_data/LSattribute-check_data.entities.xml @@ -24,3 +24,4 @@ + diff --git a/doc/conf/LSattribute/check_data/zxcvbn.docbook b/doc/conf/LSattribute/check_data/zxcvbn.docbook new file mode 100644 index 00000000..42778f08 --- /dev/null +++ b/doc/conf/LSattribute/check_data/zxcvbn.docbook @@ -0,0 +1,67 @@ + + zxcvbn + Cette règle vérifie la sécurité d'un mot de passe en utilisant la librairie + ZxcvbnPhp. Cette + librairie s'appuie sur un ensemble de vérifications permettant de déterminer à + quel point le mot de passe choisi est commun, prévisible et plus globalement, + estime en combien de temps il pourra être cassé par une personne malveillante. Sur + la base de l'analyse du mot de passe saisi, des conseils seront donnés à + l'utilisateur pour le guider dans le choix d'un mot de passe sûre. + + +Paramètres de configuration + + + 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. + + + + + userDataAttrs + + Liste d'attributs de l'objet dont les valeurs seront passées à la librairie + Zxcvbn qui les considérera comme associés à l'utilisateur. Ainsi, + par exemple, si l'utilisateur utilise son nom de famille ou encore son prénom dans + son mot de passe, la librairie pourra lui indiqué que cela ne 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. + + + + + showWarning + + Booléen définissant si les messages d'alertes retournés par la librairie + Zxcvbn doivent être affichés à l'utilisateur. Paramètre facultatif + et vrai par défaut. + + + + + showSuggestions + + Booléen définissant si les messages de suggestions retournés par la librairie + Zxcvbn doivent être affichés à l'utilisateur. Paramètre facultatif + et vrai par défaut. + + + + + zxcvbn_autoload_path + + Le chemin vers le fichier de chargement automatique des classes de la + librairie ZxcvbnPhp. Ce paramètre est facultatif et vaut + par défaut Zxcvbn/autoload.php, ce qui est adapté si vous + utiliser le paquet Debian php-zxcvbn disponible sur le dépôt + Debian du projet LdapSaisie. + + + + + + diff --git a/src/conf/LSobjects/config.LSobjects.LSpeople.php b/src/conf/LSobjects/config.LSobjects.LSpeople.php index f2244681..c4bf4c68 100644 --- a/src/conf/LSobjects/config.LSobjects.LSpeople.php +++ b/src/conf/LSobjects/config.LSobjects.LSpeople.php @@ -553,18 +553,10 @@ $GLOBALS['LSobjects']['LSpeople'] = array ( 'confirmChangeQuestion' => "Do you confirm change of this user's password?", ), 'check_data' => array( - 'password' => array( - 'msg' => 'Your password must contain from 8 to 10 characters and contains at least one caracter that match with 3 of this types :', + 'zxcvbn' => array( 'params' => array( - 'minLength' => 8, - 'maxLength' => 10, - 'regex' => array ( - '/[A-Z]/', - '/[a-z]/', - '/[0-9]/', - '/[^A-Za-z0-9]/', - ), - 'minValidRegex' => 3, + 'minScore' => 4, + 'userDataAttrs' => array('sn', 'givenName', 'mail'), ), ), ), diff --git a/src/includes/class/class.LSformRule_zxcvbn.php b/src/includes/class/class.LSformRule_zxcvbn.php new file mode 100644 index 00000000..0555c818 --- /dev/null +++ b/src/includes/class/class.LSformRule_zxcvbn.php @@ -0,0 +1,102 @@ + + */ +class LSformRule_zxcvbn extends LSformRule { + + // CLI parameters autocompleters + protected static $cli_params_autocompleters = array( + 'minScore' => array('LScli', 'autocomplete_int'), + 'userDataAttrs' => null, + 'showWarning' => array('LScli', 'autocomplete_bool'), + 'showSuggestions' => array('LScli', 'autocomplete_bool'), + 'zxcvbn_autoload_path' => null, + ); + + /** + * Validate form element values with specified rule + * + * @param mixed $rule_name The LSformRule name + * @param mixed $value The values to validate + * @param array $options Validation options + * @param object $formElement The attached LSformElement object + * + * @return boolean True if value is valid, False otherwise + */ + public static function validate($value, $options=array(), &$formElement) { + $zxcvbn = new Zxcvbn(); + $userData = array(); + $userDataAttrs = LSconfig :: get('params.userDataAttrs', array(), 'array', $options); + if ($userDataAttrs) { + foreach ($userDataAttrs as $attr) { + $attr_values = $formElement -> attr_html -> attribute -> ldapObject -> getValue($attr, false, array()); + if (is_empty($attr_values)) continue; + foreach($attr_values as $attr_value) + if (!in_array($attr_value, $userData)) + $userData[] = $attr_value; + } + } + self :: log_trace("User data: ".varDump($userData)); + $result = $zxcvbn->passwordStrength($value, $userData); + self :: log_trace("Zxcvbn result: ".varDump($result)); + self :: log_debug("Zxcvbn score: ".$result['score']); + + $minScore = LSconfig :: get('params.minScore', 4, 'int', $options); + if($result['score'] >= $minScore) { + return True; + } + + $errors = array(); + if ( + $result['feedback']['warning'] && + LSconfig :: get('params.showWarning', true, 'bool', $options) + ) { + $errors[] = $result['feedback']['warning']; + } + if (!$errors) + $errors[] = _('The security of this password is too weak.'); + + if ( + is_array($result['feedback']['suggestions']) && + LSconfig :: get('params.showSuggestions', true, 'bool', $options) + ) { + foreach($result['feedback']['suggestions'] as $msg) + if ($msg) + $errors[] = $msg; + } + + throw new LSformRuleException($errors); + } + +}