¿Hay alguna forma de verificar si existe una identificación de usuario? Quiero crear una función similar a username_exists()
pero que se devuelve si el ID existe o no.
¿Hay alguna forma de verificar si existe una identificación de usuario? Quiero crear una función similar a username_exists()
pero que se devuelve si el ID existe o no.
Usa esta función:
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; }
}
Uso:
if(user_id_exists(1)){
//it does exists
} else {
//it doesn't
}
En este caso, definitivamente no usaré get_userdata ($ user_id) mientras esté devolviendo un WP_User, por lo que es más codicioso que solo una consulta personalizada.
Sobre la consulta, estoy de acuerdo con el método de preparación, pero SELECT COUNT (*) significa que está devolviendo todas las columnas , lo cual es inútil aquí.
Recomendaría utilizar SELECT COUNT (ID) en modo no estacionario, de esta manera solo estamos trabajando en una sola columna, que será más rápida.
En otro aspecto para la declaración de retorno, sería más legible con una lógica ternaria como:
return 1 < $count ? true : false;
Para resumir, lo habría implementado como:
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;
}
Si el rendimiento es una preocupación, use:
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;
}
De lo contrario, utilice get_userdata($user_id) !== false
. La llamada a get_userdata
recuperará una fila completa de la base de datos en lugar de un solo valor, creará un nuevo objeto WP_User y lo almacenará en caché en caso de éxito.
Intente Esto no le mostrará la advertencia como Falta el argumento 2 para wpdb :: prepare ()
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; }
}
Algo que hacen al menos unos pocos hackers (lo sé porque fui víctima de esto al menos una vez) es visitar su sitio usando este tipo de URL
domain.com/?author=0
domain.com/?author=1
etc.
En un intento exitoso, la salida del sitio tendrá datos válidos, además, el usuario nicename estará en el contenido del sitio web y el apodo también estará allí (dependiendo de la salida de las páginas).
En un intento no válido, el sitio irá a la página 404 (o lo que sea que suceda en un error de página no encontrada).
Puede ser bastante trivial construir un script usando cURL que pueda probar desde say = autor hasta 0 = 999 en un tiempo relativamente corto y generar una lista de nombres de usuario. Hice que un pirata informático hiciera esto en uno de mis sitios y luego intente iniciar sesión con cada usuario utilizando otra lista de contraseñas populares.
Como puedes imaginar, la primera vez que sucede esto es un poco atemorizante ver que alguien puede encontrar fácilmente todos tus nombres de usuario. Por suerte, las contraseñas fuertes me salvaron el día, estoy seguro de que no todos tienen tanta suerte.
He probado esto con un par de sitios web de grandes nombres (que permanecerán sin nombre en esta publicación) y parece que no hay nada que alguien pueda hacer hasta ahora para evitar que esto suceda. Personalmente, creo que es un riesgo de seguridad que Wordpress deba cerrarse.
EDIT :
Aquí en el futuro (principios de 2016) Ahora sé que hay métodos / complementos que pueden frustrar este ataque de enumeración de usuarios. Y además, he cambiado mi postura sobre el riesgo de seguridad de esto y ya no creo que WordPress deba cambiar esto.