มีวิธีใดบ้างในการตรวจสอบว่ามี ID ผู้ใช้หรือไม่ ฉันต้องการสร้างฟังก์ชั่นที่คล้ายกับusername_exists()
แต่จะส่งกลับหากมี ID อยู่หรือไม่
มีวิธีใดบ้างในการตรวจสอบว่ามี ID ผู้ใช้หรือไม่ ฉันต้องการสร้างฟังก์ชั่นที่คล้ายกับusername_exists()
แต่จะส่งกลับหากมี 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
}
ฉันขอแนะนำโซลูชันที่ง่ายกว่าของแดเนียลมากกว่าโซลูชันที่เลือกไว้ในปัจจุบันว่าถูกต้อง:
$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 ดังนั้นมันจึงเป็นโลภมากกว่าแบบสอบถามที่กำหนดเอง
เกี่ยวกับข้อความค้นหาฉันยอมรับการใช้วิธีการจัดเตรียม แต่SELECT COUNT (*)หมายถึงคุณกำลังส่งคืนคอลัมน์ทั้งหมดซึ่งไม่มีประโยชน์ที่นี่
ฉันอยากจะแนะนำให้ใช้SELECT COUNT (ID) unstead ด้วยวิธีนี้เราจะทำงานในคอลัมน์เดียวเท่านั้นซึ่งจะเร็วขึ้น
ในด้านอื่น ๆ สำหรับคำสั่งที่ส่งคืนจะสามารถอ่านได้ง่ายขึ้นด้วย Ternary Logic เช่น:
ส่งคืน 1 <$ นับหรือไม่ ถูกผิด;
โดยรวมแล้วฉันจะใช้มันเหมือน:
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;
}
SELECT COUNT(*)
และSELECT COUNT(ID)
ทั้งสองคืนคอลัมน์เดียว ... การนับ
หากประสิทธิภาพเป็นข้อกังวลให้ใช้:
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 สำหรับ 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; }
}
return $count == 1;
สิ่งที่ทำโดยแฮ็กเกอร์อย่างน้อยสองสาม (ฉันรู้ว่าเพราะฉันเล่นเหยื่อนี้อย่างน้อยหนึ่งครั้ง) คือการเยี่ยมชมเว็บไซต์ของคุณโดยใช้ URL ประเภทนี้
domain.com/?author=0
domain.com/?author=1
เป็นต้น
ในความพยายามที่ประสบความสำเร็จผลลัพธ์ของเว็บไซต์จะมีข้อมูลที่ถูกต้องนอกจากนี้ชื่อผู้ใช้จะอยู่ในเนื้อหาของเว็บไซต์และชื่อเล่นอาจจะมีเช่นกัน (ขึ้นอยู่กับผลลัพธ์ของหน้าเว็บ)
ในความพยายามที่ไม่ถูกต้องเว็บไซต์จะไปที่หน้า 404 (หรือสิ่งที่กำหนดให้เกิดขึ้นในหน้าไม่พบข้อผิดพลาด)
มันค่อนข้างง่ายที่จะสร้างสคริปต์โดยใช้ cURL ที่สามารถทดสอบจากผู้เขียน say = 0 ถึงผู้เขียน = 999 ในระยะเวลาอันสั้นและส่งรายชื่อผู้ใช้ออกมา ฉันมีแฮ็กเกอร์ทำเช่นนี้กับหนึ่งในเว็บไซต์ของฉันแล้วลองลงชื่อเข้าใช้กับผู้ใช้แต่ละคนโดยใช้รายการรหัสผ่านยอดนิยมอื่น
ดังที่คุณสามารถจินตนาการได้ในครั้งแรกที่สิ่งนี้เกิดขึ้นมันค่อนข้างน่ากลัวที่จะเห็นว่ามีใครบางคนสามารถหาชื่อผู้ใช้ทั้งหมดของคุณได้อย่างง่ายดาย โชคดีสำหรับฉันรหัสผ่านที่แข็งแกร่งช่วยในวันนั้นฉันไม่แน่ใจว่าทุกคนจะโชคดี
ฉันได้ทดสอบสิ่งนี้กับเว็บไซต์ชื่อใหญ่สองสามแห่ง (ที่ยังคงไม่ระบุชื่อในโพสต์นี้) และดูเหมือนว่าอาจไม่มีอะไรที่ทุกคนสามารถทำได้เพื่อหยุดยั้งเรื่องนี้ ฉันคิดว่าเป็นการเสี่ยงด้านความปลอดภัยที่ wordpress ควรปิด
แก้ไข :
ที่นี่ในอนาคต (ต้นปี 2016) ตอนนี้ฉันรู้แล้วว่ามีวิธีการ / ปลั๊กอินที่สามารถป้องกันการโจมตีการแจงนับของผู้ใช้นี้ และฉันได้เปลี่ยนจุดยืนของฉันต่อความเสี่ยงด้านความปลอดภัยแล้วและฉันไม่คิดว่า WordPress จะเปลี่ยนสิ่งนี้อีกต่อไป
$user = get_userdata( $user_id ); if ( $user == false ){ //user id does not exist } else { //user id exists