web-dev-qa-db-fra.com

Application de la complexité du mot de passe

Nous devons appliquer la complexité du mot de passe dans un site wordpress, nous avons utilisé cet article:

http://www.webtipblog.com/force-password-complexity-requirements-wordpress/

Nous avons créé ce qui suit dans functions.php:

add_action('user_profile_update_errors', 'validateProfileUpdate', 10, 3 );
add_filter('registration_errors', 'validateRegistration', 10, 3 );
add_action('validate_password_reset', 'validatePasswordReset', 10, 2 );

function validateProfileUpdate( WP_Error &$errors, $update, &$user ) {
    return validateComplexPassword( $errors );
}

function validateRegistration( WP_Error &$errors, $sanitized_user_login, $user_email ) {
    return validateComplexPassword( $errors );
}

function validatePasswordReset( WP_Error &$errors, $userData ) {
    return validateComplexPassword( $errors );
}

function validateComplexPassword( $errors ) {

    $password = ( isset( $_POST[ 'pass1' ] ) && trim( $_POST[ 'pass1' ] ) ) ? $_POST[ 'pass1' ] : null;

    if ( empty( $password ) || ( $errors->get_error_data( 'pass' ) ) )
        return $errors;

    $passwordValidation = validatePassword($password);

    if ( $passwordValidation !== true ) {
        $errors->add( "pass", "<strong>ERROR</strong>: " . $passwordValidation . "." );
    }

    return $errors;
}

function validatePassword($Password) {
    //#### Check it's greater than 6 Characters
    if (strlen($Password) < 6) {
        return "Password is too short (" . strlen($Password) . "), please use 6 characters or more.";
    }

    //#### Test password has uppercase and lowercase letters
    if (preg_match("/^(?=.*[a-z])(?=.*[A-Z]).+$/", $Password) !== 1) {
        return "Password does not contain a mix of uppercase & lowercase characters.";
    }

    //#### Test password has mix of letters and numbers
    if (preg_match("/^((?=.*[a-z])|(?=.*[A-Z]))(?=.*\d).+$/", $Password) !== 1) {
        return "Password does not contain a mix of letters and numbers.";
    }

    //#### Password looks good
    return true;
}

Comme vous pouvez le constater, nous avons utilisé le hook validate_password_reset et l'avons utilisé pour appeler notre fonction sur-mesure validatePassword() qui teste le mot de passe avec deux expressions régulières simples.

Cependant, ce code ne semble tout simplement pas être appelé du tout lorsqu'un utilisateur réinitialise son mot de passe via wp-login.php - nous le savons car il nous permet toujours de saisir le mot de passe "woof" (qui est clairement invalide) et de vérifier à nouveau que nous mettons un code dans la fonction validateComplexPassword() pour nous envoyer un email, encore une fois, aucun email n'a été envoyé.

Y at-il quelque chose qui ne va pas avec notre code? l'action validate_password_reset n'est-elle plus appelée? Aidez-moi :)

Edit:nous avons remarqué ce qui suit dans le journal des erreurs php - cela pourrait-il être le problème?

[12-Jun-2014 14:38:12 UTC] PHP Warning:  Parameter 1 to mycohens_validatePasswordReset() expected to be a reference, value given in C:\inetpub\wwwroot\www.cohenschemist.co.uk\wp-includes\plugin.php on line 470

Edit 2:La tentative de modification de notre mot de passe via wp-admin/profile.php fonctionne parfaitement, les erreurs de notre code personnalisé sont renvoyées par wordpress, il ne s'agit que de la réinitialisation du mot de passe oublié. semblent fonctionner.

3
HeavenCore

Eh bien, j'ai fini par régler ça après des heures à me cogner la tête contre le clavier. Fixé en faisant du premier paramètre de ma fonction accrochée une valeur au lieu d’une référence - curieux de constater que presque tous les accroches dans wordpress transmettent l’objet d’erreur par référence!

function validatePasswordReset( &$errors, $userData ) {
    return validateComplexPassword( $errors );
}

changé en

function validatePasswordReset( $errors, $userData ) {
    return validateComplexPassword( $errors );
}

Curieux de savoir pourquoi la plupart des actions ont une référence sur le codex, par exemple:

http://codex.wordpress.org/Plugin_API/Action_Reference/user_profile_update_errors

mais il n'y a pas d'entrée pour validate_password_reset?

2
HeavenCore