回答:
この関数を使用します。
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; }
}
使用法:
if(user_id_exists(1)){
//it does exists
} else {
//it doesn't
}
現在正しいと選択されているソリューションよりも、Danielのはるかに単純なソリューションを強くお勧めします。
$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' );
この場合、WP_Userを返している間はget_userdata($ user_id)を使用しないので、カスタムクエリよりも貪欲です。
クエリについては、prepareメソッドの使用に同意しますが、SELECT COUNT(*)はすべての列を返すことを意味しますが、ここでは役に立ちません。
SELECT COUNT(ID)を代わりに使用することをお勧めします。この方法では、より高速になる単一の列のみを処理します。
returnステートメントの他の側面では、次のようなTernary Logicを使用するとより読みやすくなります。
1 <$ count?真/偽;
要約すると、私はそれを次のように実装したでしょう:
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(*)
、SELECT COUNT(ID)
両方とも1つの列を返します...カウント。
パフォーマンスが問題になる場合は、以下を使用します。
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;
}
それ以外の場合は、を使用しますget_userdata($user_id) !== false
。への呼び出しget_userdata
は、単一の値ではなくデータベースから行全体を取得し、新しいWP_Userオブジェクトを作成して、成功時にキャッシュします。
これを試してみると、wpdb :: prepare()の引数2がないなどの警告が表示されません
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;
少なくとも数人のハッカー(私はこれの被害者を少なくとも1度はプレイしたので知っています)によって行われることは、このタイプのURLを使用してサイトにアクセスすることです
domain.com/?author=0
domain.com/?author=1
等
成功すると、サイトの出力には有効なデータが含まれます。さらに、ユーザーnicenameがWebサイトのコンテンツに含まれ、ニックネームもそこに表示される場合があります(ページの出力によって異なります)。
無効な試みが行われると、サイトは404ページ(または、ページが見つからないというエラーで発生するように設定されているもの)に移動します。
cURLを使用して、比較的短い時間で、たとえばauthor = 0からauthor = 999までをテストし、ユーザー名のリストを出力できるスクリプトを作成するのは簡単です。私のサイトの1つでハッカーにこれを実行させ、人気のあるパスワードの別のリストを使用して各ユーザーにログインしてみました。
これが最初に起こることを想像できるように、誰かがあなたのすべてのユーザー名を非常に簡単に見つけることができるのを見るのは少し怖いです。私にとって幸運なことに、その日は強力なパスワードを保存できました。誰もがそんなに幸運であるとは限りません。
私はこれをいくつかの有名なWebサイト(この投稿では名前のないままです)に対してテストしましたが、これを防ぐために今のところ誰もできることはないようです。私は個人的に、ワードプレスが閉じるべきセキュリティ上のリスクだと思います。
編集:
ここ(2016年初頭)には、このユーザー列挙攻撃を阻止できるメソッド/プラグインがあることがわかりました。そして、これのセキュリティリスクに対する私のスタンスをさらに変更しました。WordPressがこれを変更する必要はもうないと思います。
$user = get_userdata( $user_id ); if ( $user == false ){ //user id does not exist } else { //user id exists