Şifremi Unuttum
Web uygulamaları geliştiren çoğu kişi, kendi geliştirdiği sistemlere özel üyelik sistemleri geliştirmiştir. Üyelik sistemlerinin en vazgeçilmezlerindendir “Şifremi Unuttum” özelliği. O kadar çok web sitesine üye olunabiliyor ki, bazı sitelerdeki şifreleri de unutmak doğal olsa gerek. Bu yüzden bu özelliği, web uygulamaları geliştirenler olarak es geçmeyiz.
Ama kullanıcılara hizmet olarak sunulan bu özellik, ufak gibi görünen dikkatsizliklerimizle sitemize uğrayan kötü niyetli bazı insanlara da hizmet sağlamamız anlamına geliyor
Şimdi “Şifremi Unuttum” özelliğine, Gareth Heyes’in gözüyle bakalım…
(Bu yazı Gareth Heyes’in 30/04/2007 tarihli “Forgetten Password” yazısının çevirisidir. Bazı terimleri birebir çeviri yapmak yerine, dilimizde sıklıkla kullanıldığı biçimde çevirdim. Çeviri de hatalar olabilir, gördüğünüz eksiklikleri bildirirseniz çok sevinirim
)
ŞİFREMİ UNUTTUM
Bir siteye giden en kolay yol
Son zamanlarda bir e-posta web uygulaması yazıyorum ve “şifremi unuttum” özelliğinin daha güvenli hale getirilmesi hakkında düşünüyorum. Çünkü çoğunlukla bu özellik bir korsanın web sitenize gireceği en kolay yol. Bu özelliklerle ilgili ana sorun, bilginin açığa vurulması. Örneğin, web siteniz için kullanıcı adı olarak bir e-posta adresine sahipseniz, korsan basitçe web sitenizin verdiği cevaplara bağlı olarak hangilerinin doğru hesaplar olduğunu görmek için rasgele e-posta adresleri girer.
Yani görüntülediğiniz hata mesajlarınıza dikkat etmelisiniz ve sadece verebileceğiniz kadar küçük miktarda bilgi vermelisiniz. İnternetteki birçok web sitesinin gerekenden fazlasını verdiklerini görüyorum. Eğer siz yanlış bir kullanıcı adı veya şifre girerseniz, bazı siteler hata mesajlarında çok açıktır: “Hatalı kullanıcı adı” veya “Hatalı kullanıcı adı ve şifre” gibi. Yıllar boyunca şunu öğrendim, uygulamalarımı geliştirdiğim zamanlar bu bilgilerle dikkatli olmayalım, benim hata mesajlarım çoğunlukla şöyle der: “Hatalı kullanıcı adı veya şifre”, önemsiz gibi duruyor ama bu sitenizin bütün güvenliğini iyileştirirken gerçek bir fark oluşturabilir, çünkü bu küçük parçalar toplamaya meyilli.
Şifremi unuttum özelliğinin güvenliğini nasıl arttırabiliriz?
Kolay değil çünkü bu rahat kullanımın ve güvenliğin bir dengesidir, bunları aynı noktaya getirmek gerçek bir meydan okumadır. Ben sistemime giriş için bir e-postanın kullanılmasını bırakmaya karar verdim ve yerine bir kullanıcı adı sağlıyorum. Ne zaman bir şifre sıfırlama istense, e-posta onaylamasını göndermeden önce bir kullanıcı adı ve e-posta kombinasyonu gerekiyor. Bu önceden bahsedilen riski (bir korsanın e-posta adreslerini tahmin ederek hangilerinin doğru olduğunu görebilmesi) azaltıyor çünkü şimdi bilginin iki parçasına ihtiyaçları var.
Onlar bir kez kullanıcı adı ve e-posta kombinasyonlarını girdikten sonra tabloda bu kombinasyonun olup olmadığı kontrol edilecek. Eğer kullanıcı adı veya e-posta yoksa, site genel bir hata mesajı gösterecek: “E-posta gönderilemedi, lütfen kullanıcı adı veya e-postanızı kontrol edin ve tekrar deneyin”, böylece kullanıcı için yeterli bilgi sunuluyor, fazlası değil.
Doğru kullanıcı adı ve e-posta girildiğinde; vadesi zamanla dolacak güvenli bir kıyımla (hash) bir e-posta oluşturulur. Bu kıyım;veritabanında kullanıcı için depolanan, bir tuz (salt) ile karakterlerin uzun bir zincirlemesidir. [Bkz. tuzlanmış kıyım (salted hash)] . Linke tıklandığında kullanıcı, kıyıma(hash) karşı yapılan “brute-force (deneme-yanılma)” tipi ataklara karşı koruma sağlamak için kullanıcı adı ve e-postayı tekrar isteyen bir onaylama sayfası ile karşılanır. Kıyım, kullanıcı adı ve e-posta bir kez onaylandığında, site şifreyi sıfırlar.
Eğer PHP’de MD5 kullanıyor ve URL’yi çok uzun buluyorsanız, size iyi bir ipucu: basitçe kıyımı oluşturmak ve kontrol etmek için yukarıdaki süreci izlemek ama sonra kıyımın uzunluğunu indirgemek için PHP’deki substr() fonksiyonunu kullanmak. Yani, standart bir kıyım alın: “098f6bcd4621d373cade4e832627b4f6″ ve bunu indirgeyin. Aşağıdaki kod, kıyımı alır ve 5 karakterli eşsiz dizgimizi (unique string) üretmek için 5. karakterden başlayıp 5 karakter alır. Hangi pozisyondan başlayacağını ve kaç karakter olacağını istediğiniz gibi seçebilirsiniz, sadece istediğiniz karakter sayısının kıyımın uzunluğunu geçmeyeceğinden emin olun.
$baslangic = 5;
$uzunluk = 5;
echo substr(”098f6bcd4621d373cade4e832627b4f6″, $baslangic, $uzunluk);

Güvenliğe dair güzel ipuçları var yazıda. Özellikle yeni olan arkadaşlara yol gösterecek bir yazı olmuş. Türkçe’ye çevirdiğin için teşekkürler Mustafa.
Bu arada HASH ve SALT kelimelerine güzel bir Türkçe karşılık bulmalıyız gibi geliyor bana
May 4th, 2007 at 14:04Kesinlikle haklısın. Zaten acayip geldiği için yanlarına sık sık ingilizcelerini tekrar yazdım
May 4th, 2007 at 14:42Çevirme Mustafa çevirme
Bazı kelimeler üretildiği dilde yaşarlar… Internet gibi… 
August 6th, 2007 at 03:14Belki bazıları için bu geçerli olabilir. Örneğin artık internet yerine “genel ağ” tabirini kullanmak biraz zor geliyor ama yine de elimden geldiğince ingilizce kelimeleri kullanmamaya gayret edeceğim.
August 6th, 2007 at 21:25