Bir web uygulamasında kendi kendine şifre sıfırlamayı uyguluyoruz ve bunu nasıl yapmak istediğimi biliyorum (önceden kayıtlı e-posta adresine e-posta süresi sınırlı şifre sıfırlama URL'si).
Benim sorunum geliştiriciler bu tekniği kullanarak etrafında işaret için herhangi bir referans bulamıyor olmasıdır. Birisi beni bu teknikle ilgili iyi referanslar yönünde gösterebilir mi?
Bazı öneriler:
Onaylanana kadar kullanıcının şifresini sıfırlamayın. Kullanıcının şifresini hemen sıfırlamayın. Yalnızca kullanıcı önceden kayıtlı e-posta adreslerine gönderilen bir onay bağlantısını tıkladığında sıfırlayın.
CAPTCHA iste. Bir kullanıcı şifresinin sıfırlanmasını istediğinde, devam etmeden önce bir CAPTCHA'yı çözmeye zorlayın. Bu, otomatik araçların birçok kullanıcıya keder vermeye çalışmasını önlemek ve kullanıcıyı bir insan (robot değil) olduklarını kanıtlamaya zorlamaktır.
Rastgele. Zaman sınırlı şifre sıfırlama URL'si rastgele, tahmin edilemeyen bir bileşen içermelidir. Kripto kalitesinde rastgele kullandığınızdan emin olun.
/dev/urandom Veya
System.Security.Cryptography.RNGCryptoServiceProvider Çıktıları iyi bir seçim olacaktır.
Rand() veya
random() veya
System.Random 'Dan gelen çıktı yeterince rasgele değildir ve kötü bir seçimdir. A GUID veya zaman damgası yeterince rastgele değil ve iyi bir seçim olmaz.
Bir zaman sınırı ekleyin. Sıfırlama onay bağlantısının süresi makul bir süre sonra sona ermelidir: örneğin, 24 saat. Bağlantı yalnızca bir kez kullanılabilir olmalı ve kullanılır kullanılmaz derhal sona ermelidir.
E-postaya açıklayıcı metin ekleyin. Birinin bir istekte bulunması durumunda e-postanın neden gönderildiğini açıklamak için e-postaya açıklayıcı metin eklemek isteyebilirsiniz. kendiniz olmayan bir hesap için sıfırlayın. "Birisi
username üzerindeki
site hesabınız için şifrenin sıfırlanmasını istedi. Bu isteği yaptıysanız, şifrenizi değiştirmek için burayı tıklayın. bu isteği iptal etmek için burayı tıklayın. "
Parola sıfırlandıktan sonra e-posta gönder. Parola başarıyla sıfırlandıktan sonra, parolanın değiştirildiğini bildirmek için kullanıcıya e-posta gönderin. Yeni şifreyi bu e-postaya eklemeyin.
İptalleri izleyin. Kullanıcıların sıfırlama istemediklerini belirten iptal bağlantısını tıklama sıklığını izlemek için bir mantık eklemeyi düşünebilirsiniz. Bu belirli bir eşiğin üzerine çıkarsa, sistem operatörlerine uyarı göndermek yararlı olabilir. Ayrıca, bazı istekler için bir iptal bağlantısı ziyaret edilirse after onay bağlantısı ziyaret edilirse, bu kullanıcıya karşı potansiyel bir saldırı göstergesidir - bu noktada işlem yapmak isteyebilirsiniz, ör. , kullanıcının şifresini geçersiz kılın ve şifrelerini tekrar sıfırlamalarını isteyin. (Bu, aşağıdaki saldırılara karşı bir savunmadır: Saldırgan kullanıcının posta kutusuna erişim kazanır, ardından sitenizdeki parolalarının sıfırlanmasını ister, ardından onay bağlantısını ziyaret eder. Saldırgan bu e-postaları kullanıcının gelen kutusundan silmezse, gerçek kullanıcı e-postalarını okuduğunda, iptal bağlantısını tıklatarak size olası bir sorun olduğunu gösterebilir.)
HTTPS kullanın. Bağlantının çeşitli saldırılara karşı korumak için https (http :) değil) kullanması gerekir (örn., İnternet'ten internette sörf yapan kullanıcılara yapılan Firesheep saldırıları kafe).
Bu işlemleri günlüğe kaydedin. Bu tür tüm isteklerin günlüğe kaydedilmesini öneririm. Kullanıcının kullanıcı adını günlüğe kaydetmenin yanı sıra, kullanıcıya sıfırlama bağlantısı gönderilmesini isteyen istemcinin IP adresini ve sıfırlama bağlantısını ziyaret eden istemcinin IP adresini de kaydetmek isteyebilirsiniz.
Ek okuma. Troy Hunt'ın mükemmel blog yayınını da okumak isteyebilirsiniz, Güvenli bir şifre sıfırlama özelliği oluşturma hakkında bilmek istediğiniz her şey . Bu kaynağa bağlantı için @coryT'ye teşekkürler.
Son olarak, şifre olmayan kimlik doğrulamayı göz önünde bulundurun. Parolaların bir kimlik doğrulama mekanizması olarak birçok sorunu vardır ve güvenli bir şekilde depolamak gibi diğer kullanıcıların kimlik doğrulaması yöntemlerini düşünebilirsiniz. kimlik doğrulaması için öngörülemeyen bir sır ile makinelerinde kalıcı çerez. Bu şekilde, unutulacak bir parola yoktur ve kullanıcının kimlik avı yapmasının bir yolu yoktur, ancak bir kullanıcının yeni bir makineden veya yeni bir tarayıcıdan (muhtemelen kullanıcının önceden e-postasıyla erişmesine izin vermesi için bir yol sağlamanız gerekir) kayıtlı e-posta adresi). Bu anket belgesi birçok yedek kimlik doğrulama yöntemi ve bunların güçlü ve zayıf yönleri hakkında mükemmel bir ankete sahiptir.
Troy Hunt'ın bu soruyla ilgili çok güzel bir yazısı var. Güvenli bir şifre sıfırlama özelliği oluşturma hakkında bilmek istediğiniz her şey
Size bir şifre gönderebilecek herhangi bir yer, şifreye sahip olmadıkları, ancak bir şekilde 'düz metin' için şifresinin çözülebileceği bir yerde sakladıkları anlamına gelir. Bu tek başına kötü.
Muhtemelen "en" güvenli değil, daha güvenli:
Parola istendiğinde, yerleşik GUID'si olan kullanıcıya bir parola sıfırlama bağlantısı gönderin. GUID içindeki oturumun süresi hmm, saat ya da daha fazla).
Tamam, sorunuz şu: Şifre/hesap kurtarma işlemini nasıl yapılandırmalısınız? Bu, neyi optimize etmek istediğinize bağlı olacaktır: sorunsuz kullanıcı deneyimi veya iyi güvenlik.
İyi bir güvenlik istiyorsanız:
Kayıt sırasında, kullanıcı kimlik doğrulaması için ikinci bir kanal girmelidir - cep telefonu numarası veya soru sorma yanıtı (ör. " annelerin kızlık soyadı nedir " veya daha iyisi).
Kurtarma sırasında, sisteminiz öncelikle yukarıdaki ikincil kanal - meydan okuma sorusu veya cep telefonuna bir kod göndererek veya benzeri bir yöntemle kimlik doğrulaması yapar.
Yukarıdaki ilk kimlik kontrolü temizlendiğinde, sistem yalnızca önceden girilen e-posta adresine bir şifre sıfırlama e-postası gönderir. Bu f.x'yi önlemek için ek ve önemli bir önlemdir. Sarah Palin türü istismar .
olmamalıdır yeni bir şifre veya benzeri içerir. Sitenizdeki bir HTTPS şifreli web sayfasına tıklanabilir bir bağlantı içermelidir; bu, a), URL'de sağlanan tahmin edilemeyen gizli bir değerle hesaba bağlanır, b ) zaman sınırlıdır, bu nedenle hesap kurtarma yalnızca istendikten sonra x saat çalışır, c) son kullanıcının bir yeni şifre.
Tüm hesap sıfırlama işlemlerinde iyi günlüğe sahip olun ve bir insanın bunları gerçekten izlemesini ve şüpheli görünüyorlarsa hareket etmesini sağlayın (fx IP adresleri için sunucu günlüklerine bakın, aynı IP adresinden gelen birçok istek yapın, örnekler var mı kullanıcı, kayıtlı hesap sahibinin vb. ülkelerinden farklı bir ülkeden şifreleri sıfırlamaya çalışıyor).
Bu karmaşıklığı tamamen ortadan kaldırabilirsiniz: Hala erken günler, ancak OAuth/OpenID/Facebook üzerinden oturum açın, Google vb. Bu karmaşıklığı tamamen sistemlerinizden kaldırır, ancak belki de daha az köklü kullanılabilirlik ile.
Parola sıfırlama gerçekleştirmenin en güvenli yolu, son kullanma tarihi olan ve kullanıcı kimliğine bağlı büyük, rastgele, benzersiz bir kerelik sıfırlama belirteci oluşturmaktır. SQL erişimine sahip bir saldırgan, rasgele kullanıcı şifrelerini sıfırlamak için kullanabileceğinden, token veritabanında karma olmalıdır.
E-posta adresine, sıfırlama jetonunu içeren bir sıfırlama bağlantısı gönderilmelidir. Kullanıcı bağlantıyı tıkladığında, belirtecin karması veritabanında bulunmalı ve son kullanma tarihinin gelecekte olduğu doğrulanmalıdır. Bu koşullar yerine getirilirse, kullanıcıya yeni bir parola yazmalarını sağlayan bir ekran sunulmalıdır.
Tüm bu işlem must SSL üzerinden yapılabilir, aksi takdirde bir saldırgan kullanıcı yapmadan önce URL'yi koklayabilir ve şifreyi sıfırlayabilir.
Diğer birkaç ipucu:
Uygulamanız için uygun olan veya olmayan, ancak çevrimiçi bankacılık uygulamalarında ve benzer şeylerde kullanılan başka bir tane, sıfırlama kodunun yarısını SMS mesajla kayıtlı bir cep telefonuna) göndermektir. Saldırganın bakış açısından bu, kırmak için birkaç kanaldan taviz vermeyi gerektirdiğinden tam bir PITA'dır.
SMS! 1 üzerinden müşteriyi ve cep numarasını biliyorsunuz, 2= kimlik doğrulama = SMS onlara doğrulamak için web sitesine eklemek için benzersiz bir kod onlar: )
Birkaç adım prosedürü yapın. Örneğin böyle bir şey:
www.yourdomain.com/lostpassword?param_1=x;param_2=y
Bir ve tek yakalama madde 3). X ve Y değerleri rastgele, öngörülemez olmalı ve bu özel hesaba bağlanmalıdır. Ayrıca sadece bir kez kullanılmalı ve kısa bir süre sonra (24 saat?) Bayat hale gelmelidir. Her iki değeri de karşılık gelen sütunlarla ayrılmış bir tabloda depolayın:
| some_id | user_id | X | Y | expire_time
Bir kullanıcı uygun bağlantıyı kullanmaya çalışırsa, son kullanma süresinin karşılanıp karşılanmadığını kontrol edin ve eğer değilse şifreyi değiştirmesine izin verin.