Comment vérifier si un utilisateur existe avec un identifiant donné

10

Existe-t-il un moyen de vérifier si un identifiant utilisateur existe? Je souhaite créer une fonction similaire à username_exists() mais renvoyée si l'identifiant existe ou non.

    
posée Frankolin 17.10.2014 - 15:59

6 réponses

2

Utilisez cette fonction:

function user_id_exists($user){

    global $wpdb;

    $count = $wpdb->get_var($wpdb->prepare("SELECT COUNT(*) FROM $wpdb->users WHERE ID = %d", $user));

    if($count == 1){ return true; }else{ return false; }

}

Utilisation:

if(user_id_exists(1)){ 
    //it does exists
} else {
    //it doesn't
}
    
réponse donnée Daniel Patilea 17.10.2014 - 16:02
23

Je recommanderais vivement La solution beaucoup plus simple de Daniel par rapport à la solution actuellement sélectionnée comme correcte:

$user = get_userdata( $user_id );
if ( $user === false ) {
    //user id does not exist
} else {
    //user id exists
}
    
réponse donnée Jani Uusitalo 04.03.2015 - 16:38
5

Dans ce cas, je n'utiliserai certainement pas get_userdata ($ user_id) pendant le renvoi d'un utilisateur WP_User; il s'agit donc plus gourmand que d'une requête personnalisée.

À propos de la requête, je suis d'accord avec la méthode de préparation, mais SELECT COUNT (*) signifie que vous renvoyez toutes les colonnes , ce qui est inutile ici.

Je recommanderais d'utiliser SELECT COUNT (ID) unstead. De cette manière, nous ne travaillons que sur une seule colonne, ce qui sera plus rapide.

Sur l’autre aspect de la déclaration de retour, il serait plus lisible avec une logique ternaire du type:

return 1 < $count ? true : false;

En résumé, je l'aurais mis en œuvre comme suit:

function user_id_exists( $user_id ) {
    global $wpdb;
    $count = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(ID) FROM $wpdb->users WHERE ID = %d", $user_id ) );
    return empty( $count ) || 1 > $count ? false : true;
}
    
réponse donnée Maxime Culea 18.11.2015 - 11:40
2

Si les performances vous préoccupent, utilisez:

function user_id_exists($user_id) {
    global $wpdb;

    // Check cache:
    if (wp_cache_get($user_id, 'users')) return true;

    // Check database:
    if ($wpdb->get_var($wpdb->prepare("SELECT EXISTS (SELECT 1 FROM $wpdb->users WHERE ID = %d)", $user_id))) return true;

    return false;
}

Sinon, utilisez get_userdata($user_id) !== false . L'appel à get_userdata récupérera une ligne entière de la base de données au lieu d'une valeur unique, créera un nouvel objet WP_User et le mettra en cache en cas de succès.

    
réponse donnée le_m 05.03.2017 - 23:24
0

Essayez cela ne vous montrera pas l'avertissement comme l'argument manquant 2 pour wpdb :: prepare ()

function user_id_exists($user_id){
    global $wpdb;
    $count = $wpdb->get_var($wpdb->prepare("SELECT COUNT(*) FROM $wpdb->users WHERE ID = %d",$user_id));
    if($count == 1){ return true; }else{ return false; }
}
    
réponse donnée Anand 12.06.2015 - 11:13
0

Quelque chose qui est fait par au moins quelques hackers (je sais parce que j'ai déjà été victime de cela au moins une fois) est de visiter votre site en utilisant ce type d'URL

domain.com/?author=0

domain.com/?author=1

etc.

En cas de tentative réussie, la sortie du site contiendra des données valides. En outre, l'utilisateur nicename apparaîtra dans le contenu du site Web et le pseudonyme y sera peut-être également (en fonction de la sortie des pages).

Lors d'une tentative non valide, le site accédera à la page 404 (ou à tout ce qui risque de se produire sur une erreur de page introuvable).

Il peut être assez simple de créer un script en utilisant cURL qui permet de tester, par exemple, author = 0 jusqu'à author = 999 dans un délai relativement court et de générer une liste de noms d'utilisateurs. J'ai demandé à un pirate informatique de le faire pour l'un de mes sites, puis d'essayer de vous connecter à chaque utilisateur en utilisant une autre liste de mots de passe populaires.

Comme vous pouvez l’imaginer la première fois, c’est un peu effrayant de voir que quelqu'un peut facilement trouver tous vos noms d'utilisateurs. Heureusement pour moi, les mots de passe forts ont sauvé la journée, je suis sûr que tout le monde n’a pas cette chance.

J'ai testé cela contre deux sites Web très réputés (qui resteront sans nom dans cet article) et il semble qu'il n'y ait peut-être rien que quiconque puisse faire pour empêcher cela de se produire. Personnellement, je pense que wordpress devrait fermer pour des raisons de sécurité.

MODIFIER :

Ici à l'avenir (début 2016), je sais maintenant qu'il existe des méthodes / plugins qui peuvent contrecarrer cette attaque d'énumération d'utilisateurs. Et j’ai de plus changé ma position sur le risque de sécurité lié à cela et je ne pense plus que WordPress devrait changer cela.

    
réponse donnée KnightHawk 17.10.2014 - 17:39

Lire d'autres questions sur les étiquettes