Come verificare se un utente esiste tramite un ID specifico

17 ott 2014, 16:59:39
Visualizzazioni: 42.1K
Voti: 16

Esiste un modo per verificare se l'ID di un utente esiste? Vorrei creare una funzione simile a username_exists() ma che verifichi se l'ID esiste o meno.

0
Tutte le risposte alla domanda 7
2
47

Consiglierei vivamente la soluzione molto più semplice di Daniel rispetto a quella attualmente selezionata come corretta:

$user = get_userdata( $user_id );
if ( $user === false ) {
    // l'ID utente non esiste
} else {
    // l'ID utente esiste
}
4 mar 2015 17:38:19
Commenti

Mi piace molto di più rispetto a creare una funzione apposita solo per questo. Nel mio caso dovevo comunque lavorare con i dati utente, quindi... +1

GDY GDY
29 mar 2018 20:10:31

Se hai un array di ID utente e devi rimuovere gli utenti eliminati/non esistenti, puoi usare questa funzione come callback per array_filter: $user_ids = array_filter( $user_ids, 'get_userdata' );

Oksana Romaniv Oksana Romaniv
2 ott 2019 20:55:27
2

In questo caso sicuramente non userei get_userdata( $user_id ) poiché restituisce un oggetto WP_User, risultando quindi più avido di risorse rispetto a una query personalizzata.

Per quanto riguarda la query, concordo sull'uso del metodo prepare, ma SELECT COUNT(*) significa che stai restituendo tutte le colonne, il che è inutile in questo contesto.

Consiglierei invece di usare SELECT COUNT(ID), in questo modo lavoriamo solo su una singola colonna rendendo l'operazione più veloce.

Un altro aspetto riguardo alla dichiarazione di return, sarebbe più leggibile con una logica ternaria come:

return 1 < $count ? true : false;

Per riassumere, l'avrei implementato così:

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;
}
18 nov 2015 12:40:14
Commenti

Solo per informazione, SELECT COUNT(*) e SELECT COUNT(ID) restituiscono entrambi una singola colonna... un conteggio.

Cush Cush
13 apr 2019 20:12:42

Questo è ben argomentato e ha senso. In realtà tutto dipende da dove viene eseguito. Se è in un punto dove l'utente è già stato recuperato dal database, i dati sono nella cache quindi get_userdata non causerà problemi.

Buzut Buzut
9 giu 2022 12:30:50
0

Se le prestazioni sono una preoccupazione, utilizza:

function user_id_exists($user_id) {
    global $wpdb;

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

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

    return false;
}

Altrimenti, utilizza get_userdata($user_id) !== false. La chiamata a get_userdata recupererà un'intera riga dal database invece di un singolo valore, creerà un nuovo oggetto WP_User e lo memorizzerà nella cache in caso di successo.

6 mar 2017 00:24:55
2

Usa questa funzione:

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; }

}

Utilizzo:

if(user_id_exists(1)){ 
    //esiste
} else {
    //non esiste
}
17 ott 2014 17:02:09
Commenti

puoi anche utilizzare questo metodo: $user = get_userdata( $user_id ); if ( $user == false ){ //l'ID utente non esiste } else { //l'ID utente esiste

Dan Dan
17 ott 2014 17:27:25

WP si è evoluto ma questo è ancora molto rilevante. La risposta di @Dan è la strada da seguire. In alternativa, get_user_by('id', $user_id) funziona altrettanto bene. In ogni caso, lanciare una query SQL solo per questo è eccessivo.

Buzut Buzut
9 giu 2022 12:25:08
1

Qualcosa che viene fatto almeno da alcuni hacker (lo so perché sono stato vittima almeno una volta) è visitare il tuo sito utilizzando questo tipo di URL

domain.com/?author=0

domain.com/?author=1

ecc.

In caso di tentativo riuscito, l'output del sito conterrà dati validi, inoltre il nicename dell'utente sarà presente nel contenuto del sito web e potrebbe esserci anche il nickname (a seconda dell'output delle pagine).

In caso di tentativo non valido, il sito reindirizzerà alla pagina 404 (o a qualsiasi altra cosa sia impostata per un errore di pagina non trovata).

Può essere piuttosto banale creare uno script utilizzando cURL che possa testare da, ad esempio, author=0 fino a author=999 in un tempo relativamente breve e generare un elenco di nomi utente. Un hacker ha fatto questo su uno dei miei siti e poi ha provato ad accedere a ciascun utente utilizzando un altro elenco di password comuni.

Come puoi immaginare, la prima volta che accade è un po' spaventoso vedere che qualcuno può scoprire abbastanza facilmente tutti i tuoi nomi utente. Fortunatamente per me, password complesse hanno salvato la situazione quella volta, ma sono sicuro che non tutti sono stati così fortunati.

Ho testato questo su un paio di siti web importanti (che rimarranno anonimi in questo post) e sembra che al momento non ci sia nulla che si possa fare per impedire che accada. Personalmente penso che sia un rischio per la sicurezza che WordPress dovrebbe chiudere.

AGGIORNAMENTO:

Qui nel futuro (inizio 2016) ora so che esistono metodi/plugin che possono contrastare questo attacco di enumerazione degli utenti. Inoltre ho cambiato la mia posizione sul rischio per la sicurezza di questo problema e non penso più che WordPress debba modificare questo comportamento.

17 ott 2014 18:39:10
Commenti

In ogni caso, è necessario limitare i tentativi di accesso falliti. Dopo 3-5 tentativi falliti in meno di 5 minuti, puoi bloccare l'utente per un certo periodo. Questo rallenterà significativamente gli attacchi a dizionario o brute force.

Buzut Buzut
9 giu 2022 12:33:48
2

Prova Questo non ti mostrerà il warning come Argomento 2 mancante per 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; }
}
12 giu 2015 12:13:06
Commenti

Puoi semplicemente scrivere return $count == 1;

fuxia fuxia
12 giu 2015 13:02:14

ho solo bisogno di verificare se l'utente esiste o meno e quando chiamo la funzione come:

if(!user_id_exists($userId)){ // fai qualcosa quando l'utente non esiste }

Anand Anand
12 giu 2015 13:04:14
0

Questa funzione che sto utilizzando non cambia necessariamente come viene recuperato il conteggio rispetto alle altre risposte qui presenti, semplifica semplicemente il valore di ritorno come booleano confrontando strettamente il conteggio con 1.

/**
 * Determina se un utente esiste in base all'ID utente
 *
 * @global wpdb $wpdb Oggetto di astrazione del database di WordPress.
 *
 * @param int $user_id L'ID utente di WordPress da verificare.
 *
 * @return bool True se l'ID utente esiste, false altrimenti.
 */
function user_id_exists($user_id)
{
    global $wpdb;
    return 1 === (int)$wpdb->get_var($wpdb->prepare("SELECT COUNT(*) FROM $wpdb->users WHERE ID = %d", $user_id));
}
26 mar 2024 15:48:52