Antworten:
Verwenden Sie diese Funktion:
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; }
}
Verwendung:
if(user_id_exists(1)){
//it does exists
} else {
//it doesn't
}
Ich würde Daniels viel einfachere Lösung wärmstens empfehlen als die derzeit als richtig ausgewählte:
$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 diesem Fall werde ich get_userdata ($ user_id) definitiv nicht verwenden, während es einen WP_User zurückgibt, daher ist es gieriger als nur eine benutzerdefinierte Abfrage.
In Bezug auf die Abfrage stimme ich der Verwendung der Vorbereitungsmethode zu, aber SELECT COUNT (*) bedeutet, dass Sie alle Spalten zurückgeben , was hier unbrauchbar ist.
Ich würde empfehlen, SELECT COUNT (ID) unstead zu verwenden. Auf diese Weise arbeiten wir nur an einer einzelnen Spalte, die schneller ist.
Ein anderer Aspekt für die zurückgebende Anweisung wäre mit einer ternären Logik wie: besser lesbar.
return 1 <$ count? wahr falsch;
Zusammenfassend hätte ich es wie folgt implementiert:
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(*)
und SELECT COUNT(ID)
beide geben eine einzelne Spalte zurück ... eine Zählung.
Wenn die Leistung ein Problem darstellt, verwenden Sie:
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;
}
Andernfalls verwenden Sie get_userdata($user_id) !== false
. Der Aufruf von get_userdata
ruft anstelle eines einzelnen Werts eine ganze Zeile aus der Datenbank ab, erstellt ein neues WP_User-Objekt und speichert es bei Erfolg zwischen.
Versuchen Sie Dies zeigt Ihnen nicht die Warnung wie Fehlendes Argument 2 für 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; }
}
return $count == 1;
Etwas, das von mindestens ein paar Hackern getan wird (ich weiß, weil ich mindestens einmal Opfer davon geworden bin), ist, Ihre Website unter Verwendung dieser Art von URL zu besuchen
domain.com/?author=0
domain.com/?author=1
etc.
Bei einem erfolgreichen Versuch enthält die Ausgabe der Website gültige Daten. Außerdem befindet sich der Benutzername im Inhalt der Website und möglicherweise auch der Spitzname (abhängig von der Ausgabe der Seite).
Bei einem ungültigen Versuch wechselt die Site zur 404-Seite (oder was auch immer auf einer Seite passiert ist, die nicht gefunden wurde).
Es kann ziemlich trivial sein, ein Skript mit cURL zu erstellen, das in relativ kurzer Zeit von beispielsweise author = 0 bis author = 999 testen und eine Liste von Benutzernamen ausgeben kann. Ich ließ dies von einem Hacker für eine meiner Websites ausführen und versuchte dann, mich bei jedem Benutzer mit einer anderen Liste beliebter Kennwörter anzumelden.
Wie Sie sich vorstellen können, ist es ein bisschen beängstigend zu sehen, dass jemand ganz einfach alle Ihre Benutzernamen herausfinden kann. Zum Glück haben mir starke Passwörter den Tag gerettet, ich bin sicher, nicht jeder hat so viel Glück.
Ich habe dies gegen ein paar bekannte Websites getestet (die in diesem Beitrag namenlos bleiben werden), und es scheint, dass noch niemand etwas tun kann, um dies zu verhindern. Ich persönlich denke, es ist ein Sicherheitsrisiko, dass WordPress geschlossen wird.
EDIT :
Hier in der Zukunft (Anfang 2016) weiß ich jetzt, dass es Methoden / Plugins gibt, die diesen Angriff auf die Benutzeraufzählung vereiteln können. Und ich habe meine Haltung zum Sicherheitsrisiko weiter geändert und ich denke nicht mehr, dass WordPress dies ändern sollte.
$user = get_userdata( $user_id ); if ( $user == false ){ //user id does not exist } else { //user id exists