Existe-t-il un moyen de vérifier si un identifiant utilisateur existe? Je veux créer une fonction similaire à username_exists()
mais qui retourne si l'identifiant existe ou non.
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; }
}
Usage:
if(user_id_exists(1)){
//it does exists
} else {
//it doesn't
}
Je recommande fortement La solution beaucoup plus simple de Daniel par rapport à celle actuellement sélectionnée comme correcte:
$user = get_userdata( $user_id );
if ( $user === false ) {
//user id does not exist
} else {
//user id exists
}
Dans ce cas, je n’utiliserai certainement pas le get_userdata ($ user_id) tant qu’il renvoie un WP_User, c’est donc plus gourmand qu’une simple requête personnalisée.
À propos de la requête, je suis d’accord avec la méthode prepare, 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.
Pour l’autre aspect de la déclaration de retour, il serait plus lisible avec une logique ternaire comme:
retourne 1 <compte $? vrai faux;
En résumé, je l'aurais implémenté comme ceci:
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;
}
Si la performance est une préoccupation, 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
va récupérer une ligne entière de la base de données au lieu d'une valeur unique, créer un nouvel objet WP_User et le mettre en cache en cas de succès.
Essayez ceci 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; }
}
Une chose faite par au moins quelques hackers (je sais parce que j'en ai été victime 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 aura des données valides. De plus, l'utilisateur nicename apparaîtra dans le contenu du site Web et le pseudo peut également être présent (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 temps 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 que cela se produit, 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’est pas aussi chanceux.
J'ai testé cela contre deux sites Web renommés (qui resteront sans nom dans ce billet) et il semble qu'il n'y ait rien que quiconque puisse faire pour l'instant 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.