it-swarm.com.de

Wie man den Benutzernamen und das Passwort der WordPress-Website überprüft, ist korrekt

Auf meiner Site habe ich ein Formular, mit dem der Kunde seine WordPress-Site-Details übermitteln kann. Auf diesem Formular mit diesen Feldern WordPress-Administrator-URL, Benutzername und Passwort. Ich möchte überprüfen, ob die Anmeldedaten gültig sind, bevor ich das Formular abschicke. Wie mache Ich das?

Gibt es eine Möglichkeit, WordPress REST API zu verwenden?

Wenn jemand weiß, bitte helfen Sie mir Danke!

3
developerme

Benutzernamen und Passwörter zu erhalten ist eine schreckliche Idee, der ich hoffe, dass kein Benutzer zustimmt, aber darüber hinaus wird Ihre Idee, dies von JS aus zu tun, aufgrund von CORS scheitern, was bedeutet, dass Sie dies in AJAX tun müssen. Melden Sie sich bei Ihrem Server an, und lassen Sie Ihren Server versuchen, sich anzumelden. Dies wird ihn höchstwahrscheinlich in kürzester Zeit als Brute-Force-Angreifer markieren. Alle wichtigen Sicherheitsanbieter blockieren die Anforderungen dann einfach automatisch.

Sie müssen Ihre Software so umgestalten, dass Benutzername und Kennwort nicht erforderlich sind. Verwenden Sie stattdessen möglicherweise oauth2. Wenn oauth2 für Ihre Situation nicht zutreffend ist ... nun, Pech.

3
Mark Kaplun

Erstens: Es gibt viele Gründe, warum der folgende Code fehlschlagen könnte. Es gibt keine Möglichkeit, ein System zu haben, das überall funktioniert. Dies ist auf verschiedene Sicherheits-Plugins zurückzuführen, die viele verschiedene Konzepte einführen.

Abgesehen davon funktionierte dieser Code sowohl für eine einfache Installation als auch für eine Installation mit aktiviertem Wordfence (mit nicht besonders strengen Einstellungen).


wp_remote_post() ist die Schlüsselfunktion in dieser Funktion. Hiermit können Sie POST Anfragen an Remote-Hosts senden - genau das, was Sie möchten, wenn Sie eine Anmeldung überprüfen möchten.

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

Ich habe dies in meiner lokalen Umgebung versucht. Sie können die erforderlichen Felder abrufen, die normalerweise gesendet werden, wenn Sie in Ihrem Browser auf die Datei wp-login.php zugreifen.

Dann habe ich den $result überprüft und den Unterschied zwischen richtigem und falschem Passwort verglichen. Bei einem fehlgeschlagenen Login sah der $response['headers']['set-cookie'] so aus

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

oder dieses

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

Ein erfolgreicher Login hat diese Cookies jedoch zurückgegeben

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

Wir sehen, dass wordpress_test_cookie immer gesetzt wird. wordpress_logged_in_852... wurde jedoch nur für erfolgreiche Anmeldungen festgelegt. So können wir feststellen, dass die Anmeldeinformationen korrekt sind, wenn diese vorhanden sind.

1
kero

Ohne benutzerdefinierte API-Routen ist dies nicht möglich. Sie können jedoch eine solche Route registrieren (oder stattdessen AJAX verwenden), wenn Sie das Thema bearbeiten oder Plugins auf dieser Site installieren können.

Machen wir das also mit der 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);
}

Wenn Sie eine POST -Anforderung an http://example.com/wp-json/my_namespace/check-login/ senden, die username und password enthält, erhalten Sie JSON wie folgt:

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

wobei 1 die ID des Benutzers ist, der für die angegebenen Anmeldeinformationen gefunden wurde, oder

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

Sie müssen beachten, dass dieser Code nur prüft, ob die Benutzeranmeldeinformationen korrekt sind. Es wird kein Benutzer angemeldet.

Und wenn Sie keine Kontrolle über die Website haben, die Sie überprüfen möchten?

Dann gibt es keine Möglichkeit, Ihre eigenen Routen zu registrieren, und es gibt keine Möglichkeit, REST zum Überprüfen der Benutzeranmeldeinformationen zu verwenden. Aber ... Sie können XMLRPC verwenden ...

Eine Möglichkeit ist die Verwendung dieser Bibliothek: WordPress XML-RPC PHP Client . Es erledigt den Job fast vollständig für Sie oder Sie können native WP_HTTP_IXR_Client class verwenden.

Sie können die wp.getUsersBlogs-Methode verwenden, um zu überprüfen, ob die angegebenen Anmeldeinformationen korrekt sind.

0