Risposte:
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; }
}
Uso:
if(user_id_exists(1)){
//it does exists
} else {
//it doesn't
}
Consiglio vivamente la soluzione molto più semplice di Daniel rispetto a quella attualmente selezionata come corretta:
$user = get_userdata( $user_id );
if ( $user === false ) {
//user id does not exist
} else {
//user id exists
}
$user_ids = array_filter( $user_ids, 'get_userdata' );
In questo caso non userò sicuramente get_userdata ($ user_id) mentre restituisce un WP_User, quindi è più avido di una semplice query personalizzata.
Per quanto riguarda la query, accetto l'utilizzo del metodo di preparazione, ma SELECT COUNT (*) indica che stai restituendo tutte le colonne , il che è inutile qui.
Consiglierei di utilizzare SELECT COUNT (ID) nonstead, in questo modo stiamo lavorando solo su una singola colonna che sarà più veloce.
Su un altro aspetto della dichiarazione di ritorno, sarebbe più leggibile con una logica ternaria come:
restituisce 1 <$ count? vero falso;
Per riassumere, l'avrei implementato come:
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;
}
SELECT COUNT(*)
ed SELECT COUNT(ID)
entrambi restituiscono una singola colonna ... un conteggio.
Se le prestazioni sono un problema, utilizzare:
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;
}
Altrimenti, usa get_userdata($user_id) !== false
. La chiamata a get_userdata
recupererà un'intera riga dal database anziché un singolo valore, creerà un nuovo oggetto WP_User e lo memorizzerà nella cache in caso di successo.
Prova Questo non ti mostrerà un avviso come Argomento mancante 2 per wpdb :: prepar ()
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; }
}
return $count == 1;
Qualcosa che viene fatto da almeno alcuni hacker (lo so perché l'ho giocato almeno una volta) è visitare il tuo sito usando questo tipo di URL
domain.com/?author=0
domain.com/?author=1
eccetera.
In caso di esito positivo, l'output del sito avrà dati validi, inoltre il nome utente verrà inserito nel contenuto del sito Web e il nickname potrebbe anche essere presente (a seconda dell'output delle pagine).
In caso di tentativo non valido, il sito passerà alla pagina 404 (o qualsiasi cosa sia impostata per accadere in una pagina non trovata errore).
Può essere piuttosto banale costruire uno script usando cURL che può testare da say autore = 0 fino a autore = 999 in un tempo relativamente breve e generare un elenco di nomi utente. Ho fatto fare a un hacker questo per uno dei miei siti e poi ho provato ad accedere a ciascun utente usando un altro elenco di password popolari.
Come puoi immaginare la prima volta che succede, è un po 'spaventoso vedere che qualcuno può facilmente scoprire tutti i tuoi nomi utente. Fortunatamente per me password sicure salvate quel giorno, sono sicuro che non tutti sono così fortunati.
Ho testato questo su un paio di siti Web di grandi nomi (che rimarranno senza nome in questo post) e sembra che potrebbe non esserci ancora niente che nessuno possa fare per impedire che ciò accada. Personalmente penso che sia il rischio per la sicurezza che WordPress dovrebbe chiudere.
MODIFICA :
Qui in futuro (inizio 2016) ora so che ci sono metodi / plugin che possono contrastare questo attacco di enumerazione utente. E ho ulteriormente cambiato la mia posizione sul rischio per la sicurezza di questo e non penso più che WordPress dovrebbe cambiare questo.
$user = get_userdata( $user_id ); if ( $user == false ){ //user id does not exist } else { //user id exists