是否有可能获得仅具有密码字段的用户?

时间:2013-01-22 作者:Javier Villanueva

我试过这样做:

$user = $wpdb->get_row(\'
    SELECT * 
    FROM \' . $wpdb->users . \' 
    WHERE user_pass = "\' . wp_hash_password(\'password\') . \'"\'
);
但是wp_hash_password 函数生成的字符串与数据库中的字符串不同,是否可能?

我想做的是在我的模板中有一个自定义表单,它只要求输入密码(就像用户名/密码屏幕到WP admin区域一样,没有用户名),所以我会散列用户输入的任何内容,将其与我的DB进行比较,如果匹配,则让该用户登录。

3 个回复
最合适的回答,由SO网友:Javier Villanueva 整理而成

如果其他人需要类似的功能,我会这样做:

// Simple text password
$client_password = $_POST[\'client_pwd\'];

$users = get_users();

// Iterate over all users and see if the password matches
foreach ($users as $user) {
    // If it matches log the user in
    if (wp_check_password($client_password, $user->user_pass)) {
        $user = wp_signon(
            array(
                \'user_login\'    => $user->user_login,
                \'user_password\' => $client_password
            )
        );

        if (!is_wp_error($user)) {
            // Redirect or do something else
        }
    }
}

SO网友:PrivateUser

密码并非始终唯一

根据worst password 统计数字password 是有史以来使用最多的密码。

我很确定你的一些用户也使用这个密码。

因此,多行将包含相同的哈希。因此,这是不可能的。

顺便说一下,这是一个奇怪的问题。

enter image description here

SO网友:Mark Kaplun

根据这些评论,我将回答一个意译问题——“如何制作一个在大多数情况下只显示密码字段的登录表单”。

答案是将用户名存储在一个非常长期的cookie中(一年?)每次用户登录时。

function wpse82578_set_user_cookie($logged_in_cookie, $expire, $expiration, $user_id, $state) {
  if ($state == \'logged_in\') { // user has logged in - store his name in a \'username\' cookie
    $user = get_user_by( \'id\', $user_id );
    setcookie(\'username\', $user->user_login, time() + 365*24*60*60, COOKIEPATH, COOKIE_DOMAIN);
  }
}
add_action(\'set_logged_in_cookie\', 10,5);
现在,在PHP代码中,您可以检查cookie是否已设置,并在表单中显示或隐藏用户名字段。

function wpse82578_echo_login_form() {
   ...
   if (isset($_COOKIE[\'username\'])) { // already know the user name, no point in asking for it again so just put it as hidden field
     <input type="hidden" name="log" value="<?php esc_attr($_COOKIE[\'username\'])?> />
   else { // show the field+label, ripped from wp_login_form
        <p class="login-username">
            <label for="\' . esc_attr( $args[\'id_username\'] ) . \'">\' . esc_html( $args[\'label_username\'] ) . \'</label>
            <input type="text" name="log" id="\' . esc_attr( $args[\'id_username\'] ) . \'" class="input" value="\' . esc_attr( $args[\'value_username\'] ) . \'" size="20" tabindex="10" />
        </p>
    }
}
此代码不作任何保证,但我认为它是最接近您想要的代码,同时又不会牺牲安全性和干扰WordPress用户系统。

结束