Ios Apps'te Güvenli Bir Şifre Sıfırlama Akışı Uygulayın
Table of Contents
Modern iOS uygulamaları, güvenli bir parola sıfırlama akışı, kullanıcı hesabı yönetiminin kritik bir bileşenidir. Kullanıcılara sadece bilgilerini unuturlar ancak ayrıca hesap alma saldırılarına karşı ilk savunma hattı olarak hizmet ederler.Bu makale, kötü bir şekilde sıfırlanan bir işlem, kullanıcı hırsızlığı veya brute-force-force-force oluşturma konusunda en iyi uygulamalar oluşturabilir.
Model Modelin Tehdit Tehdit Tehdit Tehdit Tehdit Tehditsini Anlamak
Herhangi bir kod yazmadan önce, karşı savunmanız için savunduğu tehditleri anlamak önemlidir. Şifre sıfırlama akışı saldırganlar için yüksek değerli bir hedeftir, çünkü kullanıcıların e-postasına sadece erişimle bir hesap kaçırmalarına izin verebilir. Anahtar tehditleri şunları içerir:
- [[Dönetici:0)E-posta sorgusu:[Dönetici:0)[Dönetici:0)[Dönetici:[Dönetici:0))) Eğer sıfır e-posta açık bir şekilde gönderilirse, bir saldırgan token çalabilir.
- [FONT:0)Token replay:[[Dönetici: 1 ) Eğer jetler bitmezse veya tek kullanımlık değilse, bir saldırgan onları meşru kullanıcı parolalarını değiştirir.
- [FONT:0]Rate-limit at:[Dönetici olmadan, bir saldırgan, hizmet veya kullanıcı sıkıntılarının reddedilmesine neden olabilir.
- [[Kategori:0) Kullanıcı enumerasyon:[Dönetici:[Dönetici:0)[Dönetici:0) Kullanıcının kayıt dışı e-postalar için farklı yanıtlar döndürürse, bir saldırgan geçerli e-posta adreslerini kaldırabilir.
- [[Düzücükler:0) Derin bağlantılar:[Dönetici:[Dönetici:0)Eğer uygulama doğrulanmamış özel bir URL programı kayıtsa, kötü niyetli bir uygulama token durdurabilir.
Her tasarım kararı bu riskleri azaltmak zorundadır. Bu makalenin geri kalanı, düzgün bir kullanıcı deneyimi verirken her tehdite nasıl hitap edeceklerini ayrıntıları.
Güvenli bir Şifrenin Anahtar Prensipleri
Bu yüksek seviyeli ilkeler, takip eden teknik uygulamaya rehberlik eder.
- [[Katılım:0) Kullanıcı Kimlik Doğrulaması:[Dönetici:[Dönetici:0) Bu, kayıtlı e-posta adresine erişime sahip olduğunu teyit etmelidir. Bu genellikle e-postaya gönderilen, rastgele oluşturulan bir token aracılığıyla yapılır.
- [FONT:0)Güvenli İletişim: [Dönetici:0) iOS uygulaması ile geri dönüş arasındaki tüm veriler, TLS 1.2 veya daha yüksek kullanım için şifreli olmalıdır.Use App Transport Security (ATS) in iOS to implement HTTPS and red insecure connections.
- [FONT:0)Token-Based Authentication:[Dönemli Kimlik:0] Sıfırlamanın sıfırlanması (en az 128 bit), kısa bir süre sonu (örneğin, 15-30 dakika), ve başarılı bir şifre değişikliğinden sonra geçersiz hale gelir. Mağaza jetonları, bir veri ihlalinden kaçınmak için veritabanında yanlış anlaşılmamalıdır.
- [[0)Minimal Data Exposure:[Dönetici:[Dönetici:0) Uygulama ve geri dönüş, bir e-posta adresinin kayıtlı olup olmadığını asla ortaya çıkarmamalıdır. “Eğer bir hesap mevcutsa, sıfır bağlantı gönderilir. Benzer şekilde URL parametrelerinde veya yanıt vücutlarında kesin olarak gerekli olan herhangi bir hesap ayrıntıları ortaya çıkar.
iOS'ta Şifre Sıfırlama Akışını Uygulamayın
Aşağıdaki adımlar tam müşteri-server etkileşimi aracılığıyla, Swift'i kullanarak iOS gelişimi için özel rehberlik ve Directus ile geri dönüş olarak bütünleşmek.
Adım 1: Kullanıcı Bir Tamamı Başlatır
Kullanıcının e-posta adresinizi girince basit bir görünüm oluşturun. gereksiz ağ aramalarını önlemek için talep göndermeden önce yerel olarak e-posta formunu uygulayın.UseENFLT:0) İstenen belgeyi uygulamak için özel bir delege ile sertifikalandırmak.
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
}
Müşterinin kayıtlı ve kayıt dışı e-posta arasında ayrım yapmadığına dikkat edin; sunucu genel bir 200 döndürür. Bu, kullanıcının enumerasyonunu önler.
2. Adım: Backend Generates ve bir Hediye gönder
Directus'ta, yerleşik kimlik doğrulama uç noktaları genişletebilir veya özel bir kanca oluşturabilirsiniz. sunucu şunları yapmalıdır:
- E-postanın var olup olmadığını kontrol edin (ama müşterinin sonucunu ortaya çıkarmaz).
- rastgele bir token (örneğin, Node.js'ta) kullanmak.
- Kullanıcı ID ve bitiş zamanları ile birlikte veritabanında token'ın bir kopyasının.
- Çiğ token içeren derin bir bağlantı içeren bir e-posta gönderin. bağlantı formatı, [[Ücretsiz 3) gibi bir şey olmalıdır.
- Uygulama oranı sınırlaması: 60 saniye içinde e-posta için sadece bir sıfır talep ve maksimum, diyelim ki, saatte 5 talep.
Directus gibi bir kafasız CMS kullanarak bunu basitleştirir çünkü kullanıcı rollerini, e-posta şablonlarını yönetebilir ve doğrudan yönetici paneli aracılığıyla veya uzantılarla sona erebilirsiniz.
3. Adım: Deep Link aracılığıyla Geçerlilik
iOS'ta, Info.plist ve uygulamaZEFLT:4 ile gelen derin bağlantıları ele alalım, bağlantıyı engellemeye çalışan diğer uygulamaları da kullanın.
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
}
Sıfır görüşe göre, uygulama yeni şifre alanlarını göstermeden önce sunucuya gönderir.Bu, kullanıcının zamanını süresiz veya kötü bilgilendirilirse önler.
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
}
Adım 4: Yeni bir Şifreyi Ayarlayın
Geçerlilik başarılılarından sonra, yeni şifre ve onay alanları sunmak.Müşteri üzerinde en zor şifre gücü kuralları (örneğin, minimum uzunluk, karakter çeşitliliği) ancak sunucuda yeni şifreyi gönderin.
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
}
Sunucu yeni şifreye sahip olmalıdır (bcrypt, argon2, vs.) ve hemen sıfırlamayı geçersiz kılmalı. Ayrıca mevcut kullanıcı seanslarını yeni bir girişe zorlamak için de geçersiz kılmalı.
Backend için Directus ile bütünleşmek
[FONT:0)Directus, varsayılan web bağlantısı yerine akışları kullanmak için inşa edilmiş bir destek sağlar.Bu, varsayılan olarak, yapılandırılabilir bir sonla bir token e-posta ile elde edilebilir. ancak, yerel bir iOS uygulaması için, varsayılan web bağlantısı yerine derin bağlantıları kullanmak için akışı özelleştirmek isteyeceksiniz.
- Doğrudanus'un varsayılan e-posta davranışını bozmak ve bunun yerine ham token içeren derin bir bağlantı gönderen özel bir kanca (veya uzatma) oluşturmak.
- Direktus'un 03:11'i kullanarak, e-postayı özel bir npm paketi veya posta servisini aşırı sağlayarak ele alın.
- Directus'un [[Dind-Uygun: 9) masasından (theurFLT:13) ve özel bir tarih alanıyla bir sona er.
Bu yaklaşım, kullanıcı yönetimini doğrudanus'ta merkezileştirebilmenize olanak sağlar, ancak iOS yerli navigasyona sıfırlama deneyimini tertemiz hale getirir.
Geliştiriciler için en iyi uygulamalar
- [FONT:0) Sınırlama:[Dönetici:[Dönetici:0)[Dönetici:0)[Dönetici:[Dönetici:[Dönetici:0)) Uygulama, IP adresi başına sıfır talepler için sunucuda üst üste üst üste üst üste ve e-posta olarak geri dön.Redis veya Directus'un yerleşik oran limitleri gibi araçları kullanın.
- [FONT=0)Token Storage:[Dönetici:[Dönetici] Hiçbir zaman veritabanında ham jetonları depolamak için kullanılır. Güçlü bir hash işlevi kullanın (SHA-256) ve geçerlilik sırasında karşılaştırmalar yapar.[/FLT:2).OWASP ayrıntılı yönergeleri sunar).
- [FONT:0)Secure Email Göndering:[Dönetici:[Dönetici:0)ExE-posta Gönderme:[Dönetici:0)[Dönetmelik ve teslimat izleme hizmetleriyle entegrasyon göz önüne alındığında, SMTP'yi TLS ile gerçekleştirilmiş kullanın.
- [FONT:0)Logging ve İzleme:[Dönetici:[Dönetici: 1) Tüm sıfır girişimleri (anonymized) kötüye kullanma modellerini tespit etmek için oturum açma. Alert on sıradışı bir akışlar tek bir IP veya e-posta domain.
- [[Düzücü Kimlik:0)Biometrik Kimlik:[Dönetici:[Dönetici: 0) Ek bir koruma olarak, kullanıcının cihazda yeni bir şifre ayarlamasına izin vermeden önce Face ID veya Touch ID'ye ihtiyaç duyar.Bu, şifreyi yeniden tanımlamak için fiziksel erişim sağlayan bir saldırganı önler.
- [FONT:0) Kullanıcı Deneyimi:[[Dönetici:0) Açık Göstermek gerekirse, teknik olmayan mesajlar kullanıcıya bir sıfırlama başarısız olduğunu söylemeyin (örneğin, “Token expired”). Bunun yerine, “ bağlantı artık geçerli değil. Lütfen yeni bir tane talep edin.
Şifreyi test edin Akışı
Thorough testi, kenar vakalarını ve zamanlama sorunlarını yakalamak için gereklidir. aşağıdaki test senaryolarını kullanın:
- Açıklamalı token - Uygulamanın 400/401 yanıtını doğrulayın ve kullanıcının yeni bir bağlantı talep etmesini yönlendirmektedir.
- Re used token – başarılı bir şifre değişikliğinden sonra, aynı tokeni tekrar kullanmaya çalışır; reddedilmelidir.
- Eş zamanlı istekler - birden fazla sıfırlama isteği gönderin ve sadece son üretilen token eserleri doğrulayın (veya hepsi bir kullanımdan sonra geçersizdir).
- Ağ kesintileri - geçerlilik veya şifre teslimi sırasında bir kesinti bağı simüle eder; uygulama, kullanıcının tutarsız bir durumda bırakmaması gerekir.
- Derin bağlantı kaçırıyor - sadece uygulamanızın özel URL programını açabileceğini ve planın görmezden geldiğini iddia eden başka herhangi bir uygulama (daha güçlü güvenlik için Evrensel Linkler) görmezden gelindiğini test edin.
XCUITest'i ağ katmanı için kullanarak bu testleri otomatikleştirin. Ayrıca, jetonların kabarık olmadığını veya tahmin edilemeyeceğini doğrulamak için bir güvenlik denetimini gerçekleştirin.
Ortak Pitfalls ve Them'dan Nasıl Kaçırmak
- [[Dönetici:0)Performasyon veya analizde tokenin eklenmesi:[Dönetici:[Dönetici:0)Tokt:0)Palmın iOS uygulaması tarafından asla girişmemesini sağlayın (örneğin, [[DüzDÜŞÜNÜye Olmayanlar) Açıklamalar veya üçüncü taraf SDK'lar.UseENFLT:15; URL loglarında parametreleri asla sorgulayın.
- [FONT:0) Tahmin edilebilir jetonlar:[Dönemli belirtilmişler:[Dönemli jetler:0)) veya sunucu-önemli kriptografik rastgele jeneratörler.
- [FONT:0] Eski seansları geçersiz kılmaz:[Dönetici:[Dönetici:0) Bir şifre sıfırlamadan sonra, sunucu tüm aktif yeni jetonları geri döndürmelidir ve bu kullanıcı için tıklayanlara erişim sağlar.
- [FONT=0)Geçmişleri görmezden gelmek için:[Dönetici:[Dönetici: 0) Uygulama geçici olarak akış süresi için sıfırı depolar (örneğin, görüntü kontrolörleri arasında geçmek), sınırlı erişilebilirlik ile mağazaya kaydetmek ([DÜDÜŞÜN)
- [FONT:0)Geçmişe kadar aktıyı kontrol etmek için kullanıcı gerekir:[Dönetici:0)Demek gerekirse, kullanıcıdan güvenlik soruları veya bir telefon numarasını doğrulamanızı gerektirmez (örneğin, bankacılık).
Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç
Bir iOS uygulamasında güvenli bir parola sıfırlama akışı uygulamak, kullanıcıların ve uygulamanızın bütünlüğüne karşı koruyabilen bir akıştır.Bu makalede belirtilen ilkeleri takip ederek - özellikle de token nesli, müşteri deneyimini özelleştirmeye güvenli bir şekilde sağlamak için esneklik sağlarken - her zaman güvenlik yönergelerinizi ve uygulamanızı koruyan bir akış inşa edebilirsiniz.[TFL:3)