如何通过给定的ID检查用户是否存在

时间:2014-10-17 作者:Frankolin

有没有办法检查用户id是否存在?我想创建一个类似于username_exists() 但如果id存在或不存在,则返回。

6 个回复
最合适的回答,由SO网友:Dan 整理而成

使用此功能:

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
}

SO网友:Jani Uusitalo

我强烈推荐Daniel\'s much simpler solution 在当前选择为正确的选项上:

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

SO网友:Maxime Culea

在这种情况下,我绝对不会使用get_userdata( $user_id ) 当它返回WP\\u用户时greedy 而不仅仅是自定义查询。

关于查询,我同意使用prepare方法,但是SELECT COUNT(*) 意味着你回来了all columns, 这在这里是无用的。

我建议使用SELECT COUNT(ID) 没有标题,这样我们只在一列上工作,速度会更快。

在返回语句的另一方面,使用三元逻辑(如:

return 1 < $count ? true : false;

总之,我会像这样实施它:

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

SO网友:le_m

如果性能是一个问题,请使用:

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\\u用户对象并在成功时缓存它。

SO网友:KnightHawk

至少有几个黑客(我知道,因为我至少有一次是这方面的受害者)会使用这种URL访问你的网站

domain.com/?author=0

domain.com/?author=1
等等。

成功尝试后,网站的输出将具有有效数据,此外,用户nicename将出现在网站的内容中,昵称也可能存在(取决于页面输出)。

如果尝试无效,站点将转到404页面(或设置为在未找到的页面上发生的任何错误)。

使用cURL构建一个脚本非常简单,它可以在相对较短的时间内从author=0到author=999进行测试,并输出用户名列表。我让一个黑客为我的一个网站这么做,然后尝试使用另一个流行密码列表登录每个用户。

你可以想象第一次发生这种情况时,看到有人可以很容易地找到你所有的用户名有点可怕。幸运的是,那天我保存了强大的密码,我相信不是每个人都这么幸运。

我已经在几个大牌网站上测试了这一点(他们在这篇文章中将不会透露姓名),似乎到目前为止,任何人都无法阻止这种情况的发生。我个人认为关闭wordpress会带来安全风险。

EDIT:

在未来(2016年初),我现在知道有一些方法/插件可以阻止这种用户枚举攻击。我进一步改变了对这一安全风险的立场,我不再认为WordPress应该改变这一点。

SO网友:Anand

尝试此操作不会显示警告,例如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; }
}

结束

相关推荐

Functions are causing errors

我在插件的PHP上声明一个函数。插件在每个帖子的顶部加载代码(帖子布局是插件的名称)。无法在/home/content/08/10290908/html/wp-content/plugins/post-layout/plugin.php(181):eval()\'d code:4)中重新声明vote\\u-up()(之前在/home/content/08/102908/html/wp-content/plugins/post-layout/plugin.php中声明)。php(181):第36行的eval