web-dev-qa-db-ja.com

与えられたIDでユーザーが存在するかどうかを調べる方法

ユーザーIDが存在するかどうかを確認する方法はありますか? username_exists()に似た関数を作成したいのですが、idが存在するかどうかによって返されます。

10
Frankolin

この機能を使う:

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
}
1
Daniel Patilea

私は強くお勧めします ダニエルのはるかに簡単な解決策 現在正しいものとして選択されたものより:

$user = get_userdata( $user_id );
if ( $user === false ) {
    //user id does not exist
} else {
    //user id exists
}
28
Jani Uusitalo

この場合、WP_Userを返している間は get_userdata($ user_id) を明示的に使用しないので、カスタムクエリよりも greedy の方が多くなります。

クエリについては、prepareメソッドを使用することに同意しますが、 SELECT COUNT(*) を指定すると、 all columns が返されます。

SELECT COUNT(ID) unsteadを使用することをお勧めします。この方法では、単一列で作業することになりますが、これはより高速になります。

返すステートメントの他の側面では、それは次のような三元論理でより読みやすくなるでしょう。

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;
}
5
Maxime Culea

パフォーマンスが問題になる場合は、次のものを使用してください。

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オブジェクトが作成されて、成功時にキャッシュされます。

2
le_m

これを試しても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; }
}
0
Anand

少なくとも数人のハッカーによって行われたこと(少なくとも1回はこの被害を受けたことがあるので知っています)は、このタイプのURLを使用してあなたのサイトにアクセスすることです。

domain.com/?author=0

domain.com/?author=1

等.

うまくいけば、サイトの出力には有効なデータが含まれ、さらにユーザーnicenameはWebサイトのコンテンツに含まれ、ニックネームも表示される可能性があります(ページの出力によって異なります)。

無効な試みでは、サイトは404ページに移動します(またはページが見つかりませんエラーで発生するように設定されているものは何でも)。

CURLを使用して比較的短い時間でsay = 0からauthor = 999までテストし、ユーザー名のリストを出力することができるスクリプトを作成するのはやや簡単です。私は自分のサイトの1つに対してハッカーにこれをやらせてから、他の一般的なパスワードのリストを使って各ユーザーにログインしようとしました。

あなたがこれが初めて起こるのを想像することができるように、誰かがあなたのすべてのユーザー名を非常に簡単に見つけることができるのを見るのは少し怖いです。私にとって幸運なことに、強力なパスワードでその日の時間を節約できました。みんながこんなに幸運であるとは限りません。

私はこれをいくつかの有名なWebサイト(この記事では名前のないままになります)に対してテストしましたが、これを防ぐためにまだ誰もできないことはないようです。私は個人的にはワードプレスが閉じるべきセキュリティ上のリスクだと思います。

_編集_

ここで将来(2016年前半)、私は今、このユーザー列挙攻撃を阻止することができるメソッド/プラグインがあることを知っています。そして、私はこれのセキュリティリスクに対する私の考えをさらに変えました、そして私はもはやWordPressがこれを変えるべきではないと思います。

0
KnightHawk