שינוי הקריטריונים לאבטחה של וורדפרס

האם יש אפשרות להשתחרר מהמגבלה של מייל ייחודי למשתמש ולאפשר כמה משתמשים על אותו מייל? התשובה היא: כמובן שכן. האם זה מתכון לצרות? נבחן.

קודם כל, איך זה אפשרי. בוורדפרס ישנו קובץ בשם pluggable.php, שכולל מספר פונקציות בסיסיות שוורדפרס שניתן לעשות להן override. אם רוצים להשתמש בפונקציונליות חלופית, כותבים את הפונקציות מחדש, עם אותה חתימה ואותו טיפוס, בפלאגין. ברגע שההרצה של וורדפרס מגיעה לקובץ pluggable.php היא בודקת אם כבר יש הגדרה לפונקציה, מאחר שפלאגינים נטענים לפני pluggable.php, ובמידה שהגדרנו, כבר יש פונקציה מוגדרת, ההגדרה הדפולטיבית לא תיקרא.

אחת מהפונקציות הניתנות להגדרה מחדש, היא פונקציית איתור המשתמש על פי תכונה כלשהיא, get_user_by. כל מה שצריך לעשות זה לבדוק לשם מה אני רוצה לאתר, ואם אני רוצה לאתר כדי לבדוק אם ניתן לרשום יוזר חדש בקריטריון שבדרך כלל היה מחזיר לי תשובה "לא", ואני רוצה בכל זאת להחזיר "כן", אז פשוט להחזיר כן. הקריטריון הוא גישה לדאטהבייס ובדיקה האם יש משתמש עם אימייל זהה. אני מונע את השאילתא לדאטהבייס שבדרך כלל היתה מחזירה "כן, קיים", ומחזיר במקומה "לא". שאר הפונקציונליות תשאר כרגיל.

כל מה שאני בודק הוא:
1. האם השדה המבוקש לבדיקה הוא email, כלומר האם הקריטריון לבדיקה הוא האם קיים אימייל כזה במערכת?
2. האם אחת מהפונקציות שגרמו לך לשאול את השאלה היא register_new_user?
3. במידה ועד כאן ענית על הכל "כן", החזר "לא" וגמור עם הבדיקה. אחרת המשך עם הבדיקה

function get_user_by( $field, $value ) {
	if($field=='email'){
		$debug=debug_backtrace();
		$functions=array_column($debug,'function');
		if(in_array('register_new_user',$functions)){
			return false;
		}
	}

	$userdata = WP_User::get_data_by( $field, $value );

	if ( !$userdata )
		return false;

	$user = new WP_User;
	$user->init( $userdata );

	return $user;
}

מה שחשוב להעביר כאן הוא: המהות של פלאגינים זה לא ניידות של קוד. זה לא פלאג אנד פליי. המהות של פלאגינים היא היכולת – היחידה – לתת פונקציונליות אחרת לכמה פונקציות בסיסיות של וורדפרס. זה מה שנקרא pluggable.

וכעת, האם זה בטוח? הסיבה שוורדפרס החליטו שהם רוצים שיהיו מזהים ייחודיים למשתמשים היא אבטחה. ככל שישנם יותר מזהים ייחודיים, או לחלופין ככל שהמזהים הינם יותר ייחודיים, כך המערכת קשוחה יותר ובטוחה יותר. האם הדרך הדפולטיבית של וורדפרס היא הבטוחה ביותר? בטוח שלא. אבל כל עוד וורדפרס דורשים שני שדות ייחודיים וגם מערבלים את הסיסמא עם שיטה יחסית אמינה – זה מה יש וזה מספיק. ניתן להקשיח יותר, ניתן להחליף ערבול והצפנה, ניתן להוסיף עוד מעצורים על ידי עוד צעדים באותנטיקציה. הרבה דברים. אם המעצור שהוספנו יעיל יותר, אין מניעה מלהוריד מעצורים בדרך. אם לא בטוח, אין סיבה להוריד את המעצור. ואין שום מניעה מלהשתמש בעוד מנגנוני אבטחה, כך שלא ברור לשם מה להסיר את המעצור הזה שבודק ייחודיות של תיבת אימייל. אבל אם רוצים, זה אפשרי. אגב, וורדפרס היו יכולים בקלות לאכוף את זה ברמת דאטהבייס ולא ברמת הקוד, אילו היו מאנדקסים את העמודה user_email כ- unique. אבל הם לא עשו את זה, דווקא כדי לרמוז לנו המשתמשים שהאכיפה של שם משתמש ייחודי אינה חובה. היא good to have, אבל לא must.

כאןפלאגין שכתבתי להורדה.

טיפים ומאמרים security, אבטחה, וורדפרס

בחזרה למאמרים