Есть ли способ проверить, существует ли идентификатор пользователя? Я хочу создать функцию, аналогичную, username_exists()
но которая возвращает, если идентификатор существует или нет.
12
Используйте эту функцию:
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
}
$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' );
В этом случае я определенно не буду использовать get_userdata ($ user_id), когда он возвращает WP_User, поэтому он более жадный, чем просто пользовательский запрос.
Что касается запроса, я согласен с использованием метода prepare, но SELECT COUNT (*) означает, что вы возвращаете все столбцы , что здесь бесполезно.
Я бы порекомендовал использовать SELECT COUNT (ID) unstead, поэтому мы работаем только с одним столбцом, который будет быстрее.
Что касается другого аспекта для возвращаемого оператора, он был бы более читабельным при использовании троичной логики:
Подводя итог, я бы реализовал это так:
источник
SELECT COUNT(*)
иSELECT COUNT(ID)
оба возвращают один столбец ... количество.Если производительность является проблемой, используйте:
В противном случае используйте
get_userdata($user_id) !== false
. Вызов toget_userdata
извлечет целую строку из базы данных вместо одного значения, создаст новый объект WP_User и кеширует его в случае успеха.источник
Попробуйте это не будет отображать предупреждение как пропущенный аргумент 2 для wpdb :: prepare ()
источник
return $count == 1;
По крайней мере, несколько хакеров (я знаю, потому что я был жертвой этого, по крайней мере, один раз) должен посетить ваш сайт, используя этот тип URL
и т.п.
При успешной попытке на выходе сайта будут действительные данные, кроме того, в его содержимом будет указано имя пользователя и псевдоним (в зависимости от вывода страниц).
При недопустимой попытке сайт перейдет на страницу 404 (или что-то еще, что должно произойти на странице не найдена ошибка).
Может быть довольно тривиально создать скрипт с использованием cURL, который может проверить, скажем, от author = 0 до author = 999 за относительно короткий промежуток времени, и вывести список имен пользователей. Я сделал, чтобы хакер сделал это для одного из моих сайтов, а затем попытался войти в систему для каждого пользователя, используя другой список популярных паролей.
Как вы можете себе представить, когда это происходит в первый раз, немного страшно видеть, что кто-то может довольно легко узнать все ваши имена пользователей. К счастью для меня, надежные пароли спасли тот день, я уверен, что не всем так везет.
Я проверил это на нескольких известных веб-сайтах (которые останутся безымянными в этом посте), и кажется, что пока что никто ничего не может сделать, чтобы этого не произошло. Лично я считаю, что WordPress должен закрыть риск для безопасности.
РЕДАКТИРОВАТЬ :
Здесь, в будущем (в начале 2016 года), теперь я знаю, что существуют методы / плагины, которые могут предотвратить эту атаку перечисления пользователей. Кроме того, я изменил свою позицию в отношении угрозы безопасности, и я больше не думаю, что WordPress должен это изменить.
источник