有没有办法检查用户id是否存在?我想创建一个类似于username_exists()
但如果id存在或不存在,则返回。
如何通过给定的ID检查用户是否存在
使用此功能:
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\'s much simpler solution 在当前选择为正确的选项上:
$user = get_userdata( $user_id );
if ( $user === false ) {
//user id does not exist
} else {
//user id exists
}
在这种情况下,我绝对不会使用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;
}
如果性能是一个问题,请使用:
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用户对象并在成功时缓存它。至少有几个黑客(我知道,因为我至少有一次是这方面的受害者)会使用这种URL访问你的网站
domain.com/?author=0
domain.com/?author=1
等等。成功尝试后,网站的输出将具有有效数据,此外,用户nicename将出现在网站的内容中,昵称也可能存在(取决于页面输出)。
如果尝试无效,站点将转到404页面(或设置为在未找到的页面上发生的任何错误)。
使用cURL构建一个脚本非常简单,它可以在相对较短的时间内从author=0到author=999进行测试,并输出用户名列表。我让一个黑客为我的一个网站这么做,然后尝试使用另一个流行密码列表登录每个用户。
你可以想象第一次发生这种情况时,看到有人可以很容易地找到你所有的用户名有点可怕。幸运的是,那天我保存了强大的密码,我相信不是每个人都这么幸运。
我已经在几个大牌网站上测试了这一点(他们在这篇文章中将不会透露姓名),似乎到目前为止,任何人都无法阻止这种情况的发生。我个人认为关闭wordpress会带来安全风险。
EDIT:
在未来(2016年初),我现在知道有一些方法/插件可以阻止这种用户枚举攻击。我进一步改变了对这一安全风险的立场,我不再认为WordPress应该改变这一点。
尝试此操作不会显示警告,例如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; }
}