web-dev-qa-db-fra.com

Faire une tentative de connexion à échoué avec wordpress admin

Actuellement, wordpress default renvoie 200 en cas d'échec ou de tentative de connexion réussie. Le standard moderne, utilisé par tous les environnements d’applications Web, consiste à renvoyer 401 (ou 403) en cas d’échec de la connexion.

Cela permet à des outils tiers (think waf, fail2ban, etc.) de détecter une tentative de forçage brutal et de le bloquer en dehors de WordPress.

Je ne trouve pas où je peux effectuer ce changement ou existe-t-il un plugin offrant une telle fonctionnalité.

Oui, je connais bien les plugins qui tentent de fournir un "blocage brutal" depuis Wordpress. Mais en plus d’être un problème en soi, ils ont tendance à être fermés de l’intérieur de l’installation de Wordpress. Et la défense est placée dans le mauvais niveau. Au lieu d’être une défense de périmètre, toutes ces demandes ont touché l’installation proprement dite de wordpress. Donc non, ce n'est pas une bonne option pour moi.

Merci pour l'aide!

1
alonisser

WordPress gère la connexion a échoué de deux manières:

  1. S'il s'agit d'une mauvaise information d'identification et que le nom d'utilisateur et le mot de passe ont une valeur, cette action peut être capturée par wp_login_failed

  2. Si les deux options, ou une seule, sont vides, WordPress génère l'objet d'erreur en tant que premier paramètre du filtre d'authentification. elle ne s'ouvre pas et l'action wp_login_failed capture cette cause/cet événement. Pour ce que nous avons fait ici,

voir les commentaires dans le code:

add_filter( 'authenticate', function( $user, $username, $password ) {
    // forcefully capture login failed to forcefully open wp_login_failed action, 
    // so that this event can be captured
    if ( empty( $username ) || empty( $password ) ) {
        do_action( 'wp_login_failed', $user );
    }
    return $user;
} );

// to handle even you can handle the error like
add_action( 'wp_login_failed', function( $username ) {
    if ( is_wp_error( $username ) ) {
        // you return 401 with wp function, this action takes place before header sent.
        $wp_query->set_401();
        status_header( 401 );
        nocache_headers();

    }
} );

ma réponse est une combinaison de: Redirige l'utilisateur à l'aide du crochet d'action 'wp_login_failed' si l'erreur est 'empty_username' ou 'empty_password' et Comment forcer un 404 sur WordPress

update:J'ai écrit un plugin extrêmement simple pour le faire WP-401-On-Failed-Login . Il utilise certains hooks d'authentification wp et set_header () avant que le contenu ne soit envoyé.

2
Amit Rahav

Si vous avez accès au serveur sur lequel votre site est exécuté, vous pouvez utiliser modsecurity pour renvoyer 401 à partir du serveur Web (au lieu de PHP).

Voici un tutoriel que j'ai écrit il y a quelque temps sur le blocage d'adresses IP et le renvoi de 401 via modsecurity:

https://smyl.es/how-to-block-wp-login-php-brute-logins-with-cpanel-mod-security-and-configserver-firewall/

1
sMyles