首先:以下代码可能会失败的原因有很多。不可能有一个到处都能运行的系统。这是由于各种安全插件引入了许多不同的概念。
话虽如此,该代码适用于普通安装以及启用了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...
仅为成功登录设置。因此,我们可以确定是否存在这种情况,凭据是否正确。