Bu kullanıcının kimlik doğrulama yöntemi zayıf yönleri nelerdir?

5 Cevap php

Ben kendi PHP çerçeve geliştiriyorum. Ben okudum tüm güvenlik malzemeleri yüzden güvenlik açıklarını bulmakta biraz yardım kullanabilirsiniz benden kullanıcı kimlik doğrulaması için çok farklı yöntemler kullanır gibi görünüyor.

Ben başlamadan önce faydalı olabilecek bazı bilgiler. Ben MVC url için mod_rewrite kullanmak. Parolalar her kullanıcı için benzersiz 24 karakter tuz ile şifrelenir. mysql_real_escape_string ve / veya her şey gidiyor, ve her şeyi htmlspecialchars'ın çıkan değişken tiplemeleri.

Step-by step process:

Her sayfanın üst:

session_start();
session_regenerate_id();

Kullanıcı giriş formu aracılığıyla günlükleri ise, kullanıcının MySQL üste koymak için yeni rastgele belirteç oluşturmak. Hash kullanıcının (onlar kayıtlı ilk ne zaman) tuz ve yeni simgesi üzerinde temel oluşturulur. Oturum değişkenleri karma ve düz metin kullanıcı adı saklayın, ve 'Beni hatırla' işaretli ise kurabiye çoğaltmak.

Her sayfada, kurabiye için kontrol edin. Çerezler ayarlarsanız, oturum değişkenleri içine kendi değerlerini kopyalayın. Sonra MySQL veritabanı karşı $ _SESSION ['isim'] ve $ _SESSION ['hash'] karşılaştırın. Böylece onlar tekrar giriş zorunda eşleşmiyor, tüm çerezleri ve oturum değişkenleri yok.

Giriş geçerli ise, MySQL veritabanı kullanıcı bazı bilgileri kolay erişim için bir dizi saklanır. Şimdiye kadar, ben bu dizi temiz yani kullanıcı erişimini sınırlayarak zaman o sayfa için gerekli ne altında ise erişimini user.rank ve inkar bakın farz ettik.

Ben XSS ve CSRF gibi tüm ortak saldırıları test etmek için denedim, ama belki ben sadece kendi sitesi hack yeterince iyi değilim! Aslında (güvenlik kodu yalnızca 100 satır uzunluğunda) güvenli olması için benim sistem yol çok basit görünüyor. Ne eksik?

Edit: denetleyicisi işlevlerini çağıran için SELECT sorguları başka bir şey kullanan bir şey kullanıcı rütbe şartlarına ek olarak, örneğin, bir silme onaylamak için $ _POST verileri isteyecektir.

Ben de mysql_real_escape dize ile güvenlik ararken çok zaman geçirdim ama (her şey birkaç yıl önce en az ve görünüşe göre sabit olmuştur olduğu) up-to-date herhangi bir bilgi bulamadım. Bütün bildiğim sorun kodlama ile ilgili bir şey olmasıdır. Bu sorun bugün hala varsa, onu nasıl önleyebilirsiniz?

Ben bir yere ödünç ve modifiye şifrelemek fonksiyonu:

public function encrypt($str, $salt = NULL) {
    if ($salt == NULL) $salt = substr(md5(uniqid(rand(), true)), 0, 24);
    else $salt = substr($salt, 0, 24);
    return $salt.sha1($salt.$str);
}

5 Cevap

Kendinize bir iyilik yapın ve parolalarınızı karma için a standard library kullanın.

Güvenlik çok daha karmaşık olma eğilimindedir ve standart bir kütüphane kullanarak daha fazla görünmeyen vidası kadar en programcılar tek başına mücadele edemeyeceğiniz olanakları ile hemen hemen her zaman en kolay ve en güvenli (yoksa sadece) seçenek olduğu için.

The standard library:
Take a look at: Portable PHP password hashing framework: phpass and make sure you use the CRYPT_BLOWFISH algorithm if at all possible.

phpass (v0.2) kullanarak kod örneği:

require('PasswordHash.php');

$pwdHasher = new PasswordHash(8, FALSE);

// $hash is what you would store in your database
$hash = $pwdHasher->HashPassword( $password );

// $hash would be the $hashed stored in your database for this user
$checked = $pwdHasher->CheckPassword($password, $hash);
if ($checked) {
    echo 'password correct';
} else {
    echo 'wrong credentials';
}

PHPass bazıları oldukça iyi bilinen projelerinde uygulamaya konmuştur:

  • phpBB3
  • WordPress 2.5 + hem de bbPress
  • Drupal 7 sürümü, (modül Drupal 5 ve 6 için kullanılabilir)
  • others

Iyi bir şey detayları hakkında endişelenmenize gerek yok, bu detayları deneyimi olan kişiler tarafından programlanan ve internet üzerinde pek çok millet tarafından gözden geçirilmiştir olduğunu.

Eğer 'I'll do it myself, thank you' yaklaşım için gitmek eğer yaparsanız yapın, do not use MD5 artık . It is a nice hashing algorithm, but utterly broken for security purposes.

Currently, using crypt, with CRYPT_BLOWFISH is the best practice.
CRYPT_BLOWFISH in PHP is an implementation of the Bcrypt hash. Bcrypt is based on the Blowfish block cipher, making use of it's expensive key setup to slow the algorithm down.

Şifre saklama planları hakkında daha fazla bilgi için, ayrıca bu konuda Jeff `s blog yazısı okumak olabilir: You're Probably Storing Passwords Incorrectly

Orada CSRF saldırıları için herhangi bir gerçek önleme görmüyorum. CSRF (benim anlayış) web sitelerinde en sık gözden kaçan / mahvettim güvenlik açığıdır. Büyük adamlar çoğu CSRF açıkları yoluyla girildi.

Bu sorunun mevcut en iyi çözüm kullanarak synchronizer tokens. edilir

Ayrıca daha iyi düzgün / kodlama kullanıcı girişi kaçan konusunda çok dindar olmak vardı. Veritabanına eklenmiş şeyler kaçmış olmalı ve kullanıcıya geri şeyler çıktı içeriklerine göre kodlanmış gerekir: vb CSS, HTML, JavaScript, tüm farklı kodlanmış gerekir.

Ayrıca, MD5 ile SHA-1 birleştirmek gerekir. SHA-1, MD5 daha güçlü olsa da, aslında MD5 ile birleştirerek zayıflatıyor. Ayrıca, bu algoritmaların de yeni uygulamalar için tavsiye edilir. Şu an için, (out-of-the-box PHP mevcuttur) SHA-256 kullanarak olmalıdır.

Fazla mühendis yaklaşım deneyerek size güvenliğini tehdit olabilir.

Ne oturum işleyicisi kullanıyorsunuz? Eğer () yerine bunun bir kopyasını yapmak daha varolan oturumu yeniden adlandırır ki session_regenerate_id kontrol ettiniz mi? Ikincisi ise o zaman rastgele bir arama ile bulmak çok daha kolay oturum dosyalarının sürü yaratıyor.

Nasıl kullanıcıların yarma oturumları ile anlaşma yapmak? Bu kod satırı tarayıcı ve nasıl kullanıcı oturumunu böler bağlı kırmaya devam ediyor.

Eğer session_regenerate_id () kullanarak gereken tek yer kullanıcı oturum zaman kullanıcının kimliğini ve ne zaman olduğunu.

mysql_real_escape_string ve / veya her şeyin devam değişken tiplemeleri

HAYIR, hayır, hayır. Bu buraya geliyor tutar.

Gelen verilerin gösterimini değiştirmek gerekmez. Tüm yollarla / / giriş doğrulamak, ve her zaman / / çıkış sterilize olmalıdır - / / girdiyi yok.

Kullanıcı giriş formu aracılığıyla günlükleri ise, kullanıcının MySQL üste koymak için yeni rastgele belirteç oluşturmak. Hash kullanıcının (onlar kayıtlı ilk ne zaman) tuz ve yeni simgesi üzerinde temel oluşturulur. Oturum değişkenleri karma ve düz metin kullanıcı adı saklayın,

Güvenliğinizi artırır şey burada

Oturum değişkenleri karma ve düz metin kullanıcı adı saklayın, ve 'Beni hatırla' eğer kurabiye çoğaltmak kontrol edilir

Yani kullanıcıların makinede düz metin parola saklamak! Bu so güvenli değildir. Eğer beni hatırladın işlevi istiyorsanız, o zaman bir tuz ile şifre ve son kullanma tarihi şifrelemek ve saklayın.

Her sayfada, kurabiye için kontrol edin. Çerezler ayarlarsanız, oturum değişkenleri içine kendi değerlerini kopyalayın.

Böylece kullanıcılar aynı isimde bir çerez dönen tarafından oturumda saklanan herhangi bir değeri işleyebilirsiniz? Tamam bu yüzden sahte kullanıcı için zor olurdu bu yüzden muhtemelen karma tahmin edemez - fakat bu sistem uzlaşma için kullanılabilecek diğer birçok yolu vardır.

Eğer sistem güvenli hale getirmek için çok uğraştım - ama en iyi aslında yaptığın tüm düzgün çalışması sistem parçalarını gizlense de.

C.

Sen değer tablosundaki var ve geçerli (aktif, silinmez vb) olduğundan emin olmak için, bir beyaz listeye karşı user.rank kontrol etmek isteyebilirsiniz, ve ayrıca isleminden ve aralık zorlamak için.

Belirteçleri gelince, bir formdan GET / POST verileri almak için beklediği her sayfa için yeni bir belirteç oluşturmak isteyeceksiniz. Bir oturum kaçırıldı sonra oturumu için bir belirteç yetersiz olabilir. Oturumu için daha kısa bir zaman aşımını ayarlama hafifletebilir.

Hemen bir tanımlama şey güvenme, Oturum stashing önce http://php.net/manual/en/book.filter.php kullanmayı düşünebilirsiniz.

Eğer sistem için bir admin paneli var planlıyorsanız bu şifre gücü, (kurulum üzerine admin / şifre stok oturumları için tercih) kılavuzu admin login isim seçimi zorlamak için idealdir.

"A '; DROP DATABASE ..." her zamanki giriş gibi isimleri kara listeye ve "Administrator", siz biliyorsunuz.

Veritabanı kurarken az ayrıcalık hesaplarını kullanmak, ziyaretçilerinizin tabloları ile harap oynuyor istemiyorum.

"Parolalar şifrelenmiş SHA1 ve MD5 vardır"

Neden iki karma işlevleri kullanmak için bir ihtiyaç olurdu? Ben nedeniyle anlayış (hiçbir suç!) Bir eksikliği bunu sanırım. Sen this article on secure password schemes (ipucu: Bcrypt kullanın) okumalısınız.