web-dev-qa-db-de.com

Erzwingen der Kennwortkomplexität

Wir müssen die Kennwortkomplexität in einer WordPress-Site erzwingen. Wir haben diesen Artikel verwendet:

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

In functions.php haben wir folgendes erstellt:

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;
}

Wie Sie sehen, haben wir den Hook validate_password_reset verwendet und damit unsere maßgeschneiderte Funktion validatePassword() aufgerufen, die das Kennwort mit ein paar einfachen regulären Ausdrücken testet.

Dieser Code scheint jedoch überhaupt nicht aufgerufen zu werden, wenn ein Benutzer sein Passwort über wp-login.php zurücksetzt - wir wissen das, weil es uns weiterhin erlaubt, das Passwort "woof" (das eindeutig ungültig ist) einzugeben und zu überprüfen, was wir eingegeben haben Ein Code in der Funktion validateComplexPassword(), um uns eine E-Mail zu senden. Wieder wurde keine E-Mail ausgelöst.

Stimmt etwas mit unserem Code nicht? wird die Aktion validate_password_reset nicht mehr aufgerufen? Hilfe :)

Edit:Wir haben Folgendes im PHP-Fehlerprotokoll bemerkt - könnte dies das Problem sein?

[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:Der Versuch, unser Passwort über wp-admin/profile.php zu ändern, funktioniert einwandfrei. Die Fehler aus unserem benutzerdefinierten Code werden von WordPress zurückgegeben scheinen zu arbeiten.

3
HeavenCore

Nun, das Problem wurde behoben, nachdem ich stundenlang mit dem Kopf gegen die Tastatur geschlagen hatte. Behoben, indem der erste Parameter meiner Hook-Funktion ein Wert anstelle einer Referenz ist - neugierig, wenn fast alle Hooks in WordPress das Fehlerobjekt als Referenz übergeben!

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

gewechselt zu

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

Neugierig, warum die meisten Aktionen einen Verweis auf den Codex haben, zum Beispiel:

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

aber es gibt keinen Eintrag für validate_password_reset?

2
HeavenCore