פרטי מדריך:
- קטגוריה:
- רמת קושי: Advanced
- זמן ביצוע: 5 עד 15 דקות
ברוכים הבאים / השבים. במדריך הבא נוסיף ביחד שדה נוסף לטופס ההתחברות של וורדפרס. בצורה זאת נחתוך בחצי את האפשרות לפרוץ לאתר שלנו בעזרת בעזרת מתקפת Brute Force.
אם עקבתם אחר מדריכים שונים אשר עוסקים באבטחת אתר וורדפרס באתר שלנו (שווה להרשם לרשימת התפוצה שלנו – רק דברים טובים!) אז האתר שלכם בוודאי מאוד מאובטח נכון להיום!
ולמרות זאת…
בחודש האחרון אני מקבל הודעות אימייל מהאתר שלי (הודות לתוסף Limit Login Attemts) שנראות כך

9 failed login attempts (3 lockout(s)) from IP: 178.137.87.39 Last user attempted: admin IP was blocked for 20 minutes
זאת כמובן רק דוגמה של הודעה שאחת שקיבלתי מתוך מאות. מישהו, אי שם בעולם, תוך שימוש באלפי שרתי פרוקסי (אין טעם לחסום IP) ובעזרת תוכנה ניסה לגלות את הקומבינציה של המשתמש / סיסמה שלי…
למה?
הסיבות יכולות להיות רבות ומגוונות. אולי כי:

- אני יהודי / ישראלי
- זה אתגר כי ומשעמם לו / לה
- הוא רוצה להוציא קישורים
- סתם כי יש תנועה לאתר וזה מסקרן?!
תהה הסיבה מה שתהיה… אותי זה דיי מעצבן וגם מעצבן אותי למחוק 100 התראות כל פעם. אבל מה עושים? אי אפשר לחסום IP מסוים כי התכנה שלהם פשוט מחליפה פרוקסי כאשר הIP שלהם ננעל אחרי כמה ניסיונות התחברות כושלים.
קצינג! נוסיף שדה נוסף לטופס ההתחברות
כמובן שיש עוד פתרונות… אני יכול להזיז את טופס ההתחברות שלי למיקום אחר. אני יכול להחביא אותו ובעזרת jQuery (בלחיצת כפתור להציג אותו שוב). אני יכול לשלוח כל ניסיון התחברות כושל או יותר נכון לעשות הפניה אל דף של הפנטגון (האמת זה עכשיו עלה לי לראש).
אבל החלטתי שאשתמש בקוד שכבר כתבתי במקום לבזבז זמן, אחרי הכל כבר 1:30 לפנות בוקר ולא חסר לי מה לעשות.
אז איך עושים את זה?
צעד 1: יוצאים לדרך
ניצור פונקציה שתיצור, תגדיר ותשמור שדה משתמש חדש
קודם כל הסבר קצר… אתם יכולים להטמיע פונקציה זאת ישירות בקובץ functions.php או שאתם יכולים ליצור קובץ חיצוני בשם custom-login.php (לדוגמה) ולהכליל אותו אל קובץ functions.php.
הקוד של הפונקציה (נקי)
<?php /*************************************************************** ** EXTRA USER FIELD - ADDITIONAL SECURITY ***************************************************************/ add_action( 'show_user_profile', 'my_show_extra_profile_fields' ); add_action( 'edit_user_profile', 'my_show_extra_profile_fields' ); function my_show_extra_profile_fields( $user ) { ?> <h3><?php _e('Extra profile information', 'sagive'); ?></h3> <table class="form-table"> <tr> <th><label for="cellphone"><?php _e('User Cell Phone Number (Digits Only)', 'sagive'); ?></label></th> <td> <input type="text" name="cellphone" id="cellphone" value="<?php echo esc_attr( get_the_author_meta( 'cellphone', $user->ID ) ); ?>" class="regular-text" tabindex="3" /><br /> <span class="description"><?php _e('Please enter the User Cell Phone Number (Digits Only)', 'sagive'); ?></span> </td> </tr> </table> <?php } add_action( 'personal_options_update', 'save_extra_user_profile_fields' ); add_action( 'edit_user_profile_update', 'save_extra_user_profile_fields' ); function save_extra_user_profile_fields( $user_id ) { if ( !current_user_can( 'edit_user', $user_id ) ) { return false; } update_user_meta( $user_id, 'cellphone', $_POST['cellphone'] ); } ?>
[php] <?php /*************************************************************** ** EXTRA USER FIELD – ADDITIONAL SECURITY ***************************************************************/
// קושרים את הפונקציה לעריכה והצגה של פרופיל משתמש בממשק הניהול add_action( 'show_user_profile', 'my_show_extra_profile_fields' ); add_action( 'edit_user_profile', 'my_show_extra_profile_fields' );
function my_show_extra_profile_fields( $user ) { ?>
// בונים את הטופס או ליתר במקרה זה השדה הבודד שנוסיף לדף משתמש בממשק הניהול <h3><?php _e('Extra profile information', 'sagive'); ?></h3>
<table class="form-table"> <tr> <th><label for="cellphone"><?php _e('User Cell Phone Number (Digits Only)', 'sagive'); ?></label></th>
<td> // השדה שאנו מוסיפים + תיאור שלו <input type="text" name="cellphone" id="cellphone" value="<?php echo esc_attr( get_the_author_meta( 'cellphone', $user->ID ) ); ?>" class="regular-text" tabindex="3" /><br /> <span class="description"><?php _e('Please enter the User Cell Phone Number (Digits Only)', 'sagive'); ?></span> </td> </tr> </table> <?php }
// קושרים את הערך בשדה שהוספנו לתהליך השמירה של הפרופיל add_action( 'personal_options_update', 'save_extra_user_profile_fields' ); add_action( 'edit_user_profile_update', 'save_extra_user_profile_fields' );
function save_extra_user_profile_fields( $user_id ) {
// יוצרים התניה שמאפשרת רק למשתמש בדרגת מנהל לערוך את השדה if ( !current_user_can( 'edit_user', $user_id ) ) { return false; } update_user_meta( $user_id, 'cellphone', $_POST['cellphone'] ); } ?> [/php]
צעד שני: מגדירים ערך
נתחבר לאתר ונשמור בה ערך רצוי (במקרה זה מספר נייד)
הכנסו לפרופיל המשתמש שלכם באתר וורדפרס שלכם (כל זה בהנחה שאתם מנהלים אתר זה) ותגלו כי נוסף שדה חדש. הכניסו בו את הנייד שלכם – מומלץ רק ספרות ושמרו את הערך.
צעד שלישי: התניה אוטומטית
נוסיף התניה לטופס ההתחברות לכלול שדה זה בין הערכים
כעת >> ורק לאחר ששמרתם את הערך בשדה החדש בפרופיל המשתמש שלכם נקשר בין טופס ההתחברות לאתר שלכם ובין השדה החדש שיצרנו.
ממש מתחת לפונקציה שיצרנו כעת נוסיף פונקציה אשר תקשר בין תהליך ההתחברות לשדה המדובר.
הוסיפו פונקציה זאת<?php /*************************************************************** ** CHECK FIELD VALUE WHEN LOGIN ***************************************************************/ // check all fields add_filter( 'authenticate', 'my_custom_authenticate', 10, 3 ); function my_custom_authenticate( $user, $username, $password ){ $cellphone = $_POST['cellphone']; $user = get_user_by('login', $username ); $stored_value = get_user_meta($user->ID, 'cellphone', true); if(!$user || empty($cellphone) || $cellphone !=$stored_value){ remove_action('authenticate', 'wp_authenticate_username_password', 20); $user = new WP_Error( 'denied', __("<strong>ERROR</strong>: You're unique identifier was invalid.") ); } return null; } add_action('login_form','extra_login_field'); function extra_login_field(){ ?> <p> <label for="cellphone"><?php _e('cell phone number (Digits Only!)', 'sagive'); ?><br> <input type="text" tabindex="20" size="20" value="" class="input" id="cellphone" name="cellphone"></label> </p> <?php } ?>
רעננו, תתנסו ותתחדשו!
זהו, סיימנו… כעת יש לכם שדה חדש בטופס ההתחברות שמחכה למספר הנייד שלכם כדי לאשר את ההתחברות לאתר שלכם. כמו תמיד אתם מוזמנים להגיב, לחלוק עצות וטיפים נוספים רלוונטיים.