Nedir php kullanıcı kimlik doğrulaması yapmak için en iyi yolu nedir?

6 Cevap php

Ben sadece 1 kullanıcı kimliğini içeren, 2 çerezleri yazı olmuştur, ve 1/2 şifre SH1 karma içeren 2. (tuzlu). Çalışır yolu açıktır.

Ben en güvenli şekilde bu iş olmadığını fark etti. Bu nedir yapmanın daha iyi bir yolu? Tercihen tek bir kimlik doğrulama tanımlama kullanıyor.

Ayrıca, "sağlamalarının hesaplamak zor" kullanarak bir nokta var mı? O I Bcrypt kullanarak, ya da (nispeten) yavaş hash fonksiyonu (200 ms vs az 1 ms sadece düz SHA1) yapmak, jakuzi ile her öğe 10.000 kez karma demek? Birisi DB ihlal ve (ben Yüklü bir de-merkezi kurulumu, çeşit yoksa) tüm verilerin aynı DB olduğundan, korumak için orada kalan ne sağlamalarının .... alırsa demek.

6 Cevap

kullanmak Sessions. Cookie de session id saklayın, ve sunucu tarafında (LoggedIn, kullanıcı kimliği, IP) kullanıcı durumunu depolamak.

Eğer oturum dizide saklamak gerekir netleştirmek için:

  • Kullanıcı veya değil kaydedilir olmadığı hakkında loggedIn: Bir boolean değişken. Birden oturumları için aynı çerez yeniden, böylece kullanıcıların sitenize, vb gelecek sefere kullanıcı adını hatırlamıyorum
  • userId: veritabanındaki kullanıcının rakipsiz bir no. Kullanıcı oturum sonra bu çok oturumda dizide tutulabilir adınızı, e-posta vb gibi, kullanıcıya daha fazla bilgi almak için bunu kullanın.
  • IP: session id çalmak ve bunu kullanarak birinin önlemek için, siz de kullanıcının IP saklamak. Bazen kullanıcı (örneğin, stackoverflow bana zaman IP değişiklikleri bana çıkıyor olmadan benim laptop ile ilgili hareket etmesine olanak sağlar) dolaşmak için izin istiyor gibi bu, isteğe bağlıdır.
  • lastPing: damgası kullanıcı son görüldü. Bu yerine çerez sona erme tarihi olarak kullanılabilmektedir. Ayrıca lifetime oturumun saklıyorsanız, o zaman hareketsizlik nedeniyle kullanıcıyı dışarı oturum açabilirsiniz. Bu oturum kimliği tanımlama çok uzun bir süre için kullanıcılar bilgisayarda saklanabilir anlamına gelir.

Kullanıcı oturum veya hareketsizlik nedeniyle dışarı oturum açtığında, sadece loggedIn ayarlamak false. Kullanıcı, loggedIn true ayarlamak ve diğer alanları (kullanıcı kimliği, IP, ömür boyu) güncelleştirmek doğru kullanıcı adı ve şifre ile oturum açtığında. Kullanıcı bir sayfayı yükler zaman, şimdiki zaman karşı lastPing kontrol ve lifetime, ve güncelleme ya lastPing veya kullanıcı çıkış.

Oturum verileri ya dosya sistemi veya bir veritabanında saklanabilir. Bir veritabanında saklanır, daha sonra kullanıcı kimliği kullanıcı kaydı için bir yabancı anahtar ya, ya tüm verilerin kullanıcı kaydı konabilir.

Hashing

Bir değer birkaç kez rehashing iyi bir fikir değildir, çünkü reduce the security. Bunun yerine birlikte şifre ile, statik bir tuz (örneğin sayfanın adını) ve kullanıcı adını birleştirerek, tuz kullanın. Uzun bir zaman alır bir karma hızlı bir karma daha iyi değil, büyük bir sindiriminde sonuçlanan bir karma (nedeniyle kaba kuvvet) kısa sindiriminde sonuçlanan bir karma daha iyidir. SHA1 kullanarak normal bir site (IE, bir banka veya gizli bir askeri örgüt) için yeterince iyi olmalıdır.

Şu anda bir kullanıcıyı tanımlamak için benzersiz bir belirteç tuzlu parola karma kendi kullanıcı adı + 1/2 'dir. Bu simge, kullanıcının parolasını değiştirir kadar her istek üzerine aynı kalacak, yani statik. Bu benim sistemde bir kullanıcı kimliğine bürünmek istiyorsanız ben sadece bir kez / Intercept belirteci yakalamak gerekiyor demektir. (Sürece çerez saklanan karma oluşturulması sırasında belirteç içine entropi tanıtan konum). Çoğu kullanıcı nadiren şifrelerini değiştirmek yana bir saldırganın kullanıcı hesabına erişmeye olmayan bir süresi dolan belirteci ne miktarda olacaktır.

Daha iyi bir çözüm PHP'nin oturum mekanizmasını kullanmak ve sürekli belirteci güncellemek için her istek üzerine session_regenerate_id çağrı etmektir. Aksi takdirde, özellikle bir IP adresi / aralık kısıtlama ile bir SSL bağlantısı üzerinden oturum kaçırma neredeyse imkansız hale getirir.

Currently I make 0 DB calls (except during login, or when something changes) for logged in users. I wanted it to remain that way... – Yegor 7 mins ago

Eğer yerleşik oturumu mekanizmasını kullanarak ek DB arama yapmak olmayacak şekilde PHP oturum verileri varsayılan dosya sistemi saklanır.

Also, is there a point to using "hard to calculate hashes"? By that I mean, using bcrypt, or hashing each item 10,000 times with whirlpool, to make it a (relatively) slow hash function (200 ms vs less than 1 ms just plain SHA1)?

Bir dize 10.000 kez karma not kez karma olmadığı kadar 10.000 kat daha güvenli hale gelmez. SHA1 veya Whirlpool gibi iyi bir tek yönlü şifreleme ile bir kez karma.

I mean if someone breaches your DB and gets the hashes.... what is there left to protect, since all your data is in the same DB (Unless you have some sort of a de-centralized setup, which I dont).

Şifre sağlamalarının Tuzlama bir rainbow table attacks onları korur. Şu anda, bir gökkuşağı tablo ile tuzlanmış şifreleri kırmak çok zor olmasa imkansız.

Eğer bir tanımlama kimliği saklamak, siteniz için bir "beni hatırla" işlevselliğini uygulamak istiyorsanız kabul edilebilir.

Sen kullanıcının çerez şifre saklamak gerekir. Onlar isterlerse, kendi tarayıcısında bu kaydedebilirsiniz.

Güvenlik gereksinimleri bu değil olabilir ya da nasıl zor belirlemek için ne kadar sıkı kendinize sorun. I Zend_Auth ve kullanımı Zend_Acl benim php uygulamalar kimlik doğrulama / yetkilendirme işlemek için. Şu anda bir çerçeve kullanıyorsanız, önerilen en iyi uygulamalar için arama yapabilirsiniz. Eğer bir çerçeve kullanarak olmasa bile bunun için bir fikir almak için başka siteler / uygulamalar aramak olabilir. Bu giriş / Entire & için https kullanarak söz konusu olduğunda, o düşünceden daha kendisine daha var tüm oturumlarda açmış, http sadece kurabiye vb

Bunu yapmanın birçok yolu var. Ben konuyla ilgili literatür yükler var gibi derinlemesine de gitmek için gitmiyorum.

  • Her şeyden önce, bu çarpışma dışı şansını azaltmak için SHA256 gibi bir şey kullanmak daha iyidir.
  • (- Oturumları çalınmasını önlemek için bu tür IP gibi) ayrıca bir değişken tuz ile tuzlama veya çift-tuzlama kullanmalısınız. Çerez dize karma önce YOURSALT123.123.123.123USERNAMEPASSWORD gibi görünecektir.
  • Kendi kurabiye ile birlikte oturumları kullanın.
  • Lütfen güvenlik gereksinimlerine bağlı olarak, SSL kullanın.

Bu, tüm need olmak için nasıl güvenli bağlıdır. Bir banka web sitesine göre kedicikler hakkında bir topluluk web sitesi farklı güvenlik gereksinimleri vardır.

Bu en iyi şekilde ve en kolay yoludur

step1 in your login/index page enter this code

<?php if(check if username and password is correct)
{
header('location:home.php');
$_SESSION['logged']=true;
}
else
{
header('location:index.php');
}
?>

sayfanızda 2. adıma kimlik doğrulamak istiyorum

<?php 
if(isset($_SESSION['logged']))
{
?>

your page content here

<?php    }
else
{
header('location:index.php');
?>

Lütfen logoutpage ADIM3

<?php

session_start();
session_destroy();
header('Location:index.php');

?>

thats all