如何检查WordPress网站用户名和密码是否正确

时间:2018-04-17 作者:developerme

在我的网站上,我有一个表格供客户提交他们的WordPress网站详细信息。在包含以下字段的表单上,WordPress管理url、用户名和密码。我想在提交表单之前检查他们的登录详细信息是否有效。我是怎么做到的?

使用WordPress REST API有什么办法吗?

如果有人知道,请帮助我,谢谢!

3 个回复
SO网友:Mark Kaplun

获取用户名和密码是一个可怕的想法,我希望没有任何用户会真正同意,但除此之外,您从JS获取用户名和密码的想法将因CORS而失败,这意味着您必须在AJAX中对服务器进行访问,并让服务器尝试登录,这很可能会立即将其标记为暴力攻击者,所有主要的安全玩家都会自动阻止这些请求。

您需要重新设计软件,使其不需要用户名和密码,可能需要使用类似oauth2的东西。如果oauth2不适用于您的情况。。。。真倒霉。

SO网友:kero

首先:以下代码可能会失败的原因有很多。不可能有一个到处都能运行的系统。这是由于各种安全插件引入了许多不同的概念。

话虽如此,该代码适用于普通安装以及启用了Wordfence(没有超严格设置)的安装。

<小时>wp_remote_post() 是此函数中的关键函数。它允许您向远程主机发送POST请求—如果您想检查登录,这正是您想要的。

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;
}
我在本地环境中尝试了这一点,如果访问wp登录,您可以获得通常发送的必要字段。浏览器中的php。

然后我检查了$result 并比较了正确密码和错误密码的区别。对于failed login, $response[\'headers\'][\'set-cookie\'] 看起来像这样

string(45) "wordpress_test_cookie=WP+Cookie+check; path=/"
或者这个

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"
}
但是successful login 退回了这些饼干

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"
}
我们看到了wordpress_test_cookie 将始终设置。然而wordpress_logged_in_852... 仅为成功登录设置。因此,我们可以确定是否存在这种情况,凭据是否正确。

SO网友:Krzysiek Dróżdż

如果没有任何自定义API路由,就无法实现这一点。但当然,如果您可以在该站点上编辑主题或安装插件,您可以注册这样的路由(或者改用AJAX)。

所以,让我们用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);
}
何时向发送POST请求

http://example.com/wp-json/my_namespace/check-login/
包含usernamepassword, 您将得到如下JSON:

{
  "error": false,
  "user": 1
}
在哪里1 是为给定凭据找到的用户ID,或

{
  "error": "...", <- this will contain error messages
  "user": false
}
您必须知道,此代码仅检查用户凭据是否正确。它不会让用户登录。

若您对要检查的站点并没有控制权,该怎么办

那么就无法注册自己的路由,也无法使用REST检查用户凭据。但是您可以使用XMLRPC。。。

一种方法是使用此库:WordPress XML-RPC PHP Client. 它几乎可以一直为您服务,或者您可以使用nativeWP_HTTP_IXR_Client

您可以使用wp.getUsersBlogs 用于检查给定凭据是否正确的方法。

结束

相关推荐

TML Theme My Login Plugin

我正在尝试将用户重定向到“感谢您注册”页面,但我无法获得它。这是代码(错误)function tml_action_url( $url, $action, $instance ) { if ( \'login\' == $action ) $url = \'url/thanks\'; return $url; } add_filter( \'tml_action_url\', \'tml_action_url\', 10, 3 );&