Table of Contents
באפליקציות של iOS מודרניות, זרימת סיסמה בטוחה היא מרכיב קריטי של ניהול חשבון המשתמש.זה לא רק עוזר למשתמשים לקבל גישה כאשר הם שוכחים את האישורים שלהם, אלא גם משמש קו הגנה ראשון נגד התקפות של לקיחת חשבון.תהליך לא מבוטל של איפוס יכול לחשוף את המשתמשים לחטוף, לגנוב אסימונים, או גניבת כוח רוטטציה, דורש שיקול זהיר של שני הלקוחות בצד השני, שילוב של תבניות אבטחה ישירות, כמו אופטימיזציה אחורית של המערכת.
הבנת מודל האיומים
לפני כתיבת כל קוד, חיוני להבין את האיומים שאתה מגן עליהם.הזרימת איפוס סיסמה היא יעד בעל ערך גבוה עבור התוקפים, כי זה יכול לאפשר להם לקצץ חשבון עם גישה רק לתיבת הדואר האלקטרוני של המשתמש או לאיומים על ידי מפתח דלף כוללים:
- (ב) אם כתובת הדואר האלקטרוני נשלחת על פני טקסט רגיל או מאוחסנת ללא ביטחון, תוקף יכול לגנוב את האסימון.
- (FLT:0) Token Replay: FLT:1 אם אסימונים לא יפוג או אינם בשימוש יחיד, תוקף יכול להשתמש בהם גם לאחר שהמשתמש הלגיטימי משנה את הסיסמה שלהם.
- (FLT:0)Rate-limit bypass:FreaLT:1 ללא רצף נכון, תוקף יכול להפציץ את השרת עם בקשות לאפסת, מה שגורם להכחשה של שירות או עצבנות משתמשים.
- (FLT:0User enumeration:FLT:1hil; אם השרת מחזיר תשובות שונות עבור הודעות דוא"ל רשומות לעומת לא רשומים, תוקף יכול לגרד כתובות דואר אלקטרוני בתוקף.
- (ב) אם האפליקציה מציגה תוכנית כתובת URL אישית שאינה מאומתת, אפליקציה זדונית יכולה ליירט את האסימון.
כל החלטה עיצובית חייבת להפחית את הסיכונים הללו.שאר הפרטים של מאמר זה כיצד לטפל בכל איום תוך מתן חוויית משתמש חלקה.
עקרונות מרכזיים של איפוס סיסמה מאובטח
עקרונות ברמה גבוהה אלה מנחים את היישום הטכני הבא.
- (FLT:0)Verification של זהות המשתמש:FLT:1 הבקשה לאפסה חייב לאשר כי האדם בהתאמת יש גישה לכתובת הדואר האלקטרוני רשומה.זה נעשה בדרך כלל באמצעות אסימוני זמן מוגבל, שנוצר באופן אקראי שנשלח לדואר אלקטרוני זה.לעולם לא לאפשר שינויים סיסמה בהתבסס רק על ידע של שם המשתמש או מספר הטלפון.
- (FLT:0) סודיות תקשורת: 1FLT (המידע החל מאפליקציית iOS ו-Backend חייב להיות מוצפן באמצעות TLS 1.2 או גבוה יותר. השתמש באבטחת הפעלה של App (ATS) ב- iOS כדי לאכוף HTTPS ולדחיק קשרים לא מאובטחים.
- (FLT:0 Token- Based Authentication:FreaLT:1) הסימון לאפסת הפורטוגרפי חייב להיות אקראי באופן קריפטוגרפי (לפחות 128 ביטים), יש תפוגה קצרה (למשל, 15-30 דקות), ולהיות מסולם מיד לאחר שינוי סיסמה מוצלח.
- (FLT:0) ,Minimal Data Exsure: 1FLT:1 היישום ו-Backend לא צריך לחשוף אם כתובת דואר אלקטרוני רשומה. השתמש הודעות גנריות כמו "אם קיים חשבון, קישור לאפסה נשלח באופן דומה, לא לחשוף את הסימון או כל פרטי חשבון בפרמטרים של כתובת URL או גופי תגובה מעבר למה שנדרש.
יישום מיפוי איפוס ב- iOS
השלבים הבאים עוברים דרך אינטראקציה מלאה של לקוחות, עם הדרכה ספציפית לפיתוח iOS באמצעות Swift ושילוב עם Directus כגיבוי.
שלב 1: המשתמש Initiates איפוס
צור תצוגה פשוטה שבה המשתמש נכנס לכתובת הדואר האלקטרוני שלו.תאמת את פורמט הדואר האלקטרוני המקומי לפני שליחת הבקשה למנוע שיחות רשת מיותרות. השתמש ב-FLT:0) עם נציג מותאם אישית לאכיפת תעודה מסמנת אם תרצה.
func requestPasswordReset(email: String) async throws {
guard isValidEmail(email) else { throw ValidationError.invalidEmail }
let url = URL(string: "https://api.example.com/auth/password/request")!
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
let body = ["email": email]
request.httpBody = try JSONEncoder().encode(body)
let (_, response) = try await URLSession.shared.data(for: request)
guard let httpResponse = response as? HTTPURLResponse,
httpResponse.statusCode == 200 else { throw NetworkError.requestFailed }
// Always show the same success message regardless of email existence
}
שימו לב כי הלקוח אינו מבחין בין דואר אלקטרוני רשום ולא רשום; השרת מחזיר 200 גנרי.זה מונע את הערכת המשתמש.
שלב 2: חזרה לייצר ושולחת Token
ב Directus, באפשרותך להרחיב את נקודות הקצה האימות המובנות או ליצור צמיד מותאם אישית.השרת צריך:
- בדוק אם הדואר האלקטרוני קיים (אך אל תחשוף את התוצאה ללקוח).
- (ב) , למשל, ב[[1924]], [[1924]]
- לאחסן גרסה מעומקת של האסימון במסד הנתונים יחד עם מזהה המשתמש וזמני התפוגה.
- שלח דוא"ל המכיל קישור עמוק הכולל את הסימון הגולמי.תבנית הקישור צריכה להיות משהו כמו FLT 3:
- הגבלת שיעור יישום: לאפשר רק בקשה לאפסה אחת לדואר אלקטרוני למשך 60 שניות, ומקסימום של, למשל, 5 בקשות לשעה.
באמצעות CMS חסר ראש כמו Directus מפשט את זה כי אתה יכול לנהל את תפקידי המשתמש, תבניות דואר אלקטרוני, ו- token תפוגה ישירות דרך לוח המודעות או באמצעות הרחבות.
שלב 3: kenation דרך קישור עמוק
ב- iOS, להתמודד עם קישורים עמוקים באמצעות FLT:4 או החדש יותר (FLT:5 עבור קישורים אוניברסליים. עבור תוכנית כתובת URL מותאם אישית, להירשם FLT:6 ב Info.plist וליישם 7 (עבור אבטחה נוספת, להשתמש קישורים אוניברסליים עם הגדרות Associated, אשר מונע יישומים אחרים החליקו את הקישור.
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
guard url.scheme == "yourapp", url.host == "reset-password",
let components = URLComponents(url: url, resolvingAgainstBaseURL: false),
let token = components.queryItems?.first(where: { $0.name == "token" })?.value else {
return false
}
// Navigate to the reset password view controller with the token
showResetPasswordView(token: token)
return true
}
ברגע על תצוגת איפוס, האפליקציה שולחת את הסימון לשרת עבור אימות לפני הצגת שדות הסיסמה החדשים.זה מונע בזבוז זמן המשתמש אם הסימון יפוג או מופרע.
func validateToken(_ token: String) async throws -> Bool {
let url = URL(string: "https://api.example.com/auth/password/validate")!
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
let body = ["token": token]
request.httpBody = try JSONEncoder().encode(body)
let (data, response) = try await URLSession.shared.data(for: request)
guard let httpResponse = response as? HTTPURLResponse,
httpResponse.statusCode == 200 else { return false }
// You can optionally decode a response that includes the userID for later use
return true
}
שלב 4: קביעת סיסמה חדשה
לאחר אימות אסימונים מצליח, להציג את שדות הסיסמה והאישור החדשים.Aforce סיסמה כללים על הלקוח (למשל, אורך מינימלי, מגוון אופי) אבל תמיד revalidate על השרת.הגשת הסיסמה החדשה יחד עם הסימון (או פגישה שקיבלת אימות) לנקודת קצה סופית.
func resetPassword(token: String, newPassword: String) async throws {
guard isPasswordStrong(newPassword) else { throw ValidationError.weakPassword }
let url = URL(string: "https://api.example.com/auth/password/reset")!
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
let body = ["token": token, "password": newPassword]
request.httpBody = try JSONEncoder().encode(body)
let (_, response) = try await URLSession.shared.data(for: request)
guard let httpResponse = response as? HTTPURLResponse,
httpResponse.statusCode == 200 else { throw NetworkError.resetFailed }
// Token is now invalidated; show success and navigate to login
}
השרת חייב להיות הסיסמה החדשה (בקריפט, argon2 וכו ') ולהחיל את אסימונים לאפסת איפוס מיד.זה צריך גם לאותר כל מפגשי משתמש קיימים כדי לכפות כניסה חדשה.
עקבו אחרי Directus for Backend Logic
(FLT:0)Directus מספק תמיכה מובנה עבור סיסמה איפוסsFLT 1:1 באמצעות REST ו GraphQL APIs. כברירת מחדל, זה הודעות דוא"ל aken עם תפוגה חד-משמעית. עם זאת, עבור אפליקציית iOS Native, סביר להניח שתרצה להתאים את הזרם לשימוש קישורים עמוקים במקום הקישור ברירת מחדל.
- התנהגות הדואר האלקטרוני של Disabling Directus ברירת המחדל ובמקום זאת יוצרת צמיד מותאם אישית (או הרחבה) ששולח קישור עמוק המכיל את הסימון הגולמי.
- באמצעות Directus's ,FLT:11 , נקודת קצה כדי ליצור את האסימון, ולאחר מכן ליירט את הדואר האלקטרוני באמצעות חבילת npm מותאמת אישית או על ידי פיזור שירות הדואר.
- הובלת הסימון בטבלת ה-Directus'sFLT:12 (שדה 13:13) והגדרת תפוגה באמצעות שדה תאריך מותאם אישית.
גישה זו מאפשרת לך לשמור על ניהול משתמשים מרכזי ב Directus תוך התאמה החוויה של איפוס לניווט Native iOS.
הפרקטיקה הטובה ביותר למפתחים
- (FLT:0)Rate Limiting:FLT:1 יישום אקספוננציאלי בשרת לבקשות לאפסה לכתובת IP ולכלים לשימוש כמו Redis או מגבילי קצב בנוי של Directus.
- (ב) ⁇ (ב) ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇
- (FLT:0) שלח דואר אלקטרוני: FLT:1ir השתמש SMTP אותנטי עם TLS. שקול שילוב עם שירותים כגון SendGrid או Amazon SES המציעים מעקב ועידוד משלוח.
- (FLT:0) אופטימיזציה ופיקוח: 1FLT) Log allניסיונות איפוס (anonymized) לזהות דפוסי התעללות.אזהרה על ספייקטים יוצאי דופן מתחום IP או דוא"ל יחיד.
- (FLT:0) ביומטרי Authentication:FreaLT:1 כהגנה נוספת, דורש זיהוי פנים או Touch ID לפני המאפשר למשתמש להגדיר סיסמה חדשה על המכשיר.זה מונע תוקף שיש לו גישה פיזית לטלפון נעול משיקום הסיסמה.
- User Experience:BuildFLT:1] Showברור, הודעות לא טכניות להימנע מלספר למשתמש מדוע איפוס נכשל (למשל, "הבלוק" (הקישור כבר לא חוקי) בבקשה לבקש חדש.
תגית: The Password איפוס Flow
בדיקות תורו הוא חיוני כדי לתפוס מקרים קצה ובעיות תזמון. השתמש בתרחישים הבאים:
- אסימונים חיצוניים - לאמת את האפליקציה מטפלת בתגובה של 400/401 ופניית את המשתמש לבקש קישור חדש.
- קידוד בשימוש – לאחר שינוי סיסמה מוצלח, מנסה להשתמש שוב באותו אסימונים; יש לדחות אותו.
- בקשות קונדומים - לשלוח בקשות איפוס מרובות ולוודא שרק עבודות הסימון שנוצרו לאחרונה (או כי כולם מסולפים לאחר שימוש אחד).
- הפרעות ברשת - לדמות קשר שנפל במהלך אימות אסימונים או הגשת סיסמה; האפליקציה לא צריכה לעזוב את המשתמש במצב לא עקבי.
- משיכת קישורים עמוקה – בדקו שרק האפליקציה שלכם יכולה לפתוח את תוכנית ה-URL המקובלת וכי כל אפליקציה אחרת שטענה כי התוכנית מתעלמת (שימוש בקישורים אוניברסליים לאבטחה חזקה יותר).
אוטומטי את הבדיקות האלה באמצעות XCUITest עבור הזרמת UI ו- Units בדיקות עבור שכבת הרשת.גם לבצע ביקורת אבטחה עם כלי בדיקות חדירת חדירה כדי לאמת כי אסימוניות לא ניתן למנוע או לנחש.
מלכודות נפוצות וכיצד להימנע מהם
- (ב) [ה]:0] להצגת הסימון בגליונים או בניתוח: ⁇ FLT [1] ודא שהסימון מעולם לא מתפרסם על ידי אפליקציית iOS (למשל, באמצעות מהדורות של 14:14 או ב- SDK של צד שלישי).
- (ב) [15] , ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇
- (FLT:0) לא יסולא את המפגשים הישנים:FreaLT:1) לאחר איפוס סיסמה, השרת צריך לשלול את כל אסימוני רענון פעיל וסימון גישה עבור אותו משתמש.זה מכריח כל רשומה ב-לדוגמה של האפליקציה כדי לתקן מחדש.
- (ב) אם האפליקציה מאחסנת באופן זמני את הסימון של ה-Cychain:0 (ה-ignoing the Keychain:FLT:1; אם האפליקציה מאחסנת באופן זמני את הסימון למחזור (למשל, לעבור בין בקרים), לאחסן אותו ב- Keychain עם נגישות מוגבלת (FLT:17).
- (FLT:0) הגדלת הזרם:FearLT:1 בעוד אבטחה היא רבת ערך, להימנע הוספת חיכוך מיותר.לדוגמה, לא צריך את המשתמש לענות על שאלות אבטחה או לאמת מספר טלפון אלא אם כן איפוס הוא עבור חשבון ערכי גבוה (למשל, בנקאות) לשמור על UX פשוט: קישור סיסמה חדשה.
מסקנה
יישום של סיסמה בטוחה לאפסת לתוך אפליקציית iOS הוא אתגר רב שכבתי הממאזן את יכולת השליטה באבטחה חזקה.על ידי ביצוע העקרונות המפורטים במאמר זה - במיוחד סביב הדור הסימון, חיבור עמוק, הגבלת קצב ומניעת הפחתת המשתמשים - אתה יכול לבנות זרם שמגן על המשתמשים שלך ועל השלמות של היישום שלך.