web-dev-qa-db-fra.com

Comment vérifier que le nom d'utilisateur et le mot de passe du site Web WordPress sont corrects

Sur mon site, j'ai un formulaire permettant au client de soumettre ses détails de site WordPress. Sur ce formulaire contenant ces champs URL d'administrateur WordPress, nom d'utilisateur et mot de passe. Je veux vérifier que leurs identifiants sont valides avant de soumettre le formulaire. Comment je fais ça?

S'il y a moyen de faire en utilisant WordPress REST API?

Si quelqu'un sait s'il vous plaît aidez-moi Merci!

3
developerme

Obtenir des noms d'utilisateur et des mots de passe est une idée horrible. J'espère qu'aucun utilisateur ne l'acceptera, mais au-delà de votre idée de le faire à partir de JS va échouer à cause de CORS, ce qui signifie que vous devrez le faire dans AJAX sur votre serveur et laissez votre serveur essayer de se connecter, ce qui le signalera probablement comme un attaquant par force brute en un rien de temps, et tous les principaux acteurs de la sécurité bloqueront automatiquement les requêtes.

Vous devez redéfinir votre logiciel pour ne pas avoir besoin de nom d'utilisateur et de mot de passe, utilisez probablement quelque chose comme oauth2 à la place. Si oauth2 ne s'applique pas à votre situation ... eh bien, bonne chance.

3
Mark Kaplun

Tout d'abord: il y a plusieurs raisons pour lesquelles le code suivant pourrait échouer. Il n'y a aucun moyen d'avoir un système qui fonctionne partout. Cela est dû au fait que divers plugins de sécurité ont introduit de nombreux concepts différents.

Cela dit, ce code a fonctionné pour une installation en clair ainsi que pour une installation avec Wordfence (avec des paramètres peu rigoureux) activé.


wp_remote_post() est la fonction principale de cette fonction. Il vous permet d’envoyer POST demandes aux hôtes distants - ce qui est exactement ce que vous voulez si vous voulez vérifier une connexion.

function WPSE_test_remote_login($url, $username, $password) {
    // remove trailing slash if it exists
    $base = rtrim($url, '/');

    // login url
    $url = $base . '/wp-login.php';

    $args = [
        // the inputs that get POSTed
        'body' => [
            'log' => $username,
            'pwd' => $password,
            'wp-submit' => 'Submit',
            'redirect_to' => $base . '/wp-admin/',
            'testcookie' => 1,
        ],
    ];

    // make the actual request
    $response = wp_remote_post($url, $args);

    // only one cookie? then failed login
    if ( ! is_array($response['headers']['set-cookie'])) {
        return false;
    }

    // if a cookie that contains wordpress_logged_in is set
    // the login was successful
    foreach ($response['headers']['set-cookie'] as $cookie) {
        if (stripos($cookie, 'wordpress_logged_in') !== FALSE) {
            return true;
        }
    }

    return false;
}

J'ai essayé cela dans mon environnement local, vous pouvez obtenir les champs nécessaires qui sont généralement envoyés si vous accédez au fichier wp-login.php dans votre navigateur.

Ensuite, j'ai vérifié le $result et comparé la différence entre un mot de passe correct et un mot de passe incorrect. Pour un échec de la connexion , $response['headers']['set-cookie'] ressemblait à ceci

string(45) "wordpress_test_cookie=WP+Cookie+check; path=/"

ou ca

array(3) {
  [0]=>
  string(128) "__cfduid=df131...; expires=Sun, 21-Apr-19 12:35:00 GMT; path=/; domain=.example.com; HttpOnly"
  [1]=>
  string(100) "wfvt_144...=5ad...; expires=Sat, 21-Apr-2018 13:05:00 GMT; Max-Age=1800; path=/; HttpOnly"
  [2]=>
  string(74) "wordpress_test_cookie=WP+Cookie+check; path=/; domain=.example.com; secure"
}

Cependant, un connexion réussie a retourné ces cookies

array(4) {
  [0]=>
  string(45) "wordpress_test_cookie=WP+Cookie+check; path=/"
  [1]=>
  string(209) "wordpress_852...=test%7C15...; path=/wp-content/plugins; HttpOnly"
  [2]=>
  string(199) "wordpress_852...=test%7C15...; path=/wp-admin; HttpOnly"
  [3]=>
  string(201) "wordpress_logged_in_852...=test%7C15...; path=/; HttpOnly"
}

Nous voyons que wordpress_test_cookie sera toujours réglé. Cependant, wordpress_logged_in_852... n'était défini que pour les connexions réussies. Nous pouvons donc déterminer que, si cela existe, les informations d'identification sont correctes.

1
kero

Il n’ya aucun moyen d’y parvenir sans routes d’API personnalisées. Mais bien sûr, vous pouvez enregistrer un tel itinéraire (ou utiliser plutôt AJAX), si vous pouvez modifier le thème ou installer des plugins sur ce site.

Faisons cela avec REST API ...

function my_register_api_hooks() {
    register_rest_route(
        'my_namespace', '/check-login/',
        array(
            'methods'  => 'POST',
            'callback' => 'my_api_check_login_callback',
        )
    );
}
add_action( 'rest_api_init', 'my_register_api_hooks' );

function my_api_check_login_callback($request){
    $user = wp_authenticate_username_password(null, $request['username'], $request['password']);

    if ( is_wp_error($user) ) {
        return array('error' => $user, 'user' => false);
    }

    return array('error' => false, 'user' => $user->ID);
}

Lorsque vous envoyez une demande POST à http://example.com/wp-json/my_namespace/check-login/ contenant username et password, vous obtenez le code JSON comme ceci:

{
"error": false,
"user": 1
}

1 est l'ID de l'utilisateur trouvé pour les informations d'identification données, ou

{
"error": ..., <- this will contain error messages
"user": false
}

Vous devez savoir que ce code vérifie uniquement si les informations d'identification de l'utilisateur sont correctes. Il ne connectera pas l'utilisateur.

Et si vous n'avez aucun contrôle sur le site que vous souhaitez vérifier?

Ensuite, il n'y a aucun moyen d'enregistrer vos propres itinéraires et d'utiliser REST pour vérifier les informations d'identification de l'utilisateur. Mais ... Vous pouvez utiliser XMLRPC ...

Une façon d'utiliser cette bibliothèque: WordPress XML-RPC PHP Client . Il fera presque tout le travail à votre place ou vous pouvez utiliser le fichier WP_HTTP_IXR_Client class natif.

Vous pouvez utiliser la méthode wp.getUsersBlogs pour vérifier si les informations d'identification fournies sont correctes.

0
Krzysiek Dróżdż