Benim PHP kimlik doğrulama çabaları Eleştirisi Lütfen

6 Cevap php

Süre geri this a gönderdikten sonra, ben PHP kendi Kayıt / Doğrulama yeteneği yaratmaya karar verdi. Kimsenin iyileştirilmesi için, özellikle oturumda saklanan ne çevresindeki kusurları / fırsatları işaret etmek isterim ...

Mantıksal akışı:

1 - Kullanıcı, daha sonra erişim ve harfler ve sayılar içermelidir en az 6 karakterden oluşan bir şifre olacak herhangi bir url parçasını oluşturan bir "site adı" olarak e-posta kullanarak Kullanıcı Kayıtları (Ben bu güçlü olabileceğini biliyorum)

2 - kullanıcı ve site benzersiz Sağlanan, sonra benim veritabanındaki auth tabloda bir satır rasgele oluşturulmuş bir dize (tuz) ile birlikte, her ikisi de bu depolar. Daha sonra, kullanıcıların şifreyi almak ona tuz birleştirmek ve aynı veritabanı satırda bu tuzlu şifreniz md5 hash saklamak

3 - Bir sonra kullanıcı oturum açtığında, ben o girilmeden şifresini almak ve bunun için tuz birleştirmek, o bir md5 hash oluşturmak, ve ben veritabanında saklanan ne karşılaştırın - Onlar maç olmadığını, kullanıcı girdi Doğru şifre ve kullanıcı adı oturumuna yazılır

4 - Her istek üzerine, ben veritabanını sorgulamak ve bu kullanıcı ile ilişkili site adını okumak için oturumunda saklanan kullanıcı adını kullanın. Daha sonra url kendisi site adı bu karşılaştırmak ve onlar geri kalanı için erişilebilir veya komut dosyası (değil global bir değişken olan bir değişken set eşleşen bir kullanıcı görebilirsiniz eğer, bu karar hangi benim denetleyicisi ile sadece okunabilir İki site adları eşleşen yoksa, kullanıcı giriş için belirli bir sayfa) geri yönlendirilir

Benim endişe onlar ile imzalanan adınızı biliyorsanız eğer birisi oturuma yazmak ve böylece halklar sayfalarına erişmek mümkün olabilir mi? Bunu nasıl önlenmesi hakkında gitmek istiyorsunuz?

Herkes arada ihmali beni suçluyor önce bu öğrenme için kişisel bir proje - Ben herhangi bir müşteri veri ifşa değilim!

6 Cevap

  1. Neden 6 karakter? Daha büyük yapmak ve 6 (veya daha fazla) karakter az gerektirir. Parola karakter sayısını 6 sınırlandırılması için hiçbir bahane yoktur.

  2. Oturumunda kullanıcı isim daha koyun. Ama güvenli bir şekilde bunu yapmak için, size tuzdan her giriş değiştirmeniz gerekir:

A- From the login page: Take name and password verify with existing salt. If valid update the user table salt and password with a new salt (you have the password from the user so you can md5 it and the salt again). Write the md5 of the password to the session. B- From any other page: compare the user and hashed password against the database. If they don't match, redirect to the login page.

Bu fikir ile kusur kullanıcı birden fazla makine / tarayıcılarda giriş korumak olamaz.

Sizin kayıt sistemi çalışmak gerekiyor. Nasıl e-posta adresi geçerli olduğunu biliyor musunuz? Nasıl kullanıcı işlemleri e-posta adresi sahibi biliyor musunuz? Eğer herhangi bir şey için hesap erişimine izin vermeden önce geri tıklandığında olmalıdır sitenize bir bağlantı içeren adrese e-posta göndermeniz gerekir. Sitenize almak o kişiye spam sitenizin kapatıldı Aksi takdirde birisi o kişi olarak hileli iddiada başkasının e-posta adresi altında kaydolmak ya da sadece neden olur.

Ayrıca komut dosyası kayıtları sınırlamak için CAPTCHA araştırmak isteyebilirsiniz.

Kısa cevap: iyi görünüyor!

Uzun cevap:

  1. Evet, güçlü bir uzun / şifreleri izin vermelidir, ancak aksi takdirde bu Tamam. Sadece emin site adı için (ben PCRE sözcük karakteri ile sopa), yalnızca geçerli url bölümlük karakterleri kabul olun. Ancak, "Bu e-postayı doğrulamak" sistemi tescil aslında sağlanan e-posta adresini kontrol emin olmak için, uygun olacaktır.
  2. Iyi görünüyor. Gerçi, md5 daha SHA1 gibi.
  3. Sürece oturumları güvenli olarak, siz (- go ahead ve PK saklamak her sayfa isteği SQL için oldukça pahalı bir arama olurdu), sadece kullanıcı adı daha saklayabilirsiniz.
  4. Iyi görünüyor, ama # 3 benim yorumlarına göre ayarlanmalıdır

, Emin düzgün oturum güvenliğini kullanımı vardır yapmak kontrol etmek için the guide on PHPSec.

  • Oturumları üzerindeki hızını sınırlandırın. Bir kullanıcı için her girişimi yapın ve pek çok başarısız denemeden sonra bunları kilitleyin. Başarısız girişimleri yukarı monte olarak, lokavt uzun ve daha uzun yapmak.

  • Statik kodunuzda bir tuz ekleyin ve veritabanından tuz ile birlikte kullanabilirsiniz. Eğer db kesmek alırsa Sonra, yine koddan tuz yok. Bu tuz / değiştirmemelisiniz olamaz.

  • Kullanıcıların şifreleri alabilirsiniz / lokavt sıfırlamak? Eğer meydan soru ve cevapları toplamak gerekir.

  • Kullanıcıların kendi şifrelerini sıfırlamak, onlar özgün bir bilmek zorunda mı?

Burası güvenli bir site, ya da kimse izler sadece bir site eğer. Seni giriş makineden makineye çerez alabilir sitelerin biliyoruz. Her zaman sizi hatırlar, ama çok sorun için potansiyeli düşüktür sadece bir forumdur.

Why salt the code as well as the database? Once your database is hacked your site is toast. However seeing users tend to use the same password on many sites, no sense in helping hack everybody's property. If they get your code too then the royal screwing happens, but lets put up as many barriers as we can.

Bilinmezlik aracılığıyla güvenlik aptal, ama güvenlik birçok katmanları yardımcı olabilir.

Regarding putting username in session Hash the username, url and a salt. Store that in the database and in the session. use that as authentication, if that isn't valid dump them to the login. they can't copy the cookie to another site, they won't be exposing their username as much, and it eliminates a query.

Hatta oturumda her X sayfaları manzarası ve mağaza onu sona erecek ve zamanla daha az kullanışlı bunu çalmak yapmak için o tuzlu değerini yeniden olabilir. Daha sonra veritabanında iki tuzları saklamak istiyorsunuz. Şifre biri, kimlik doğrulama oturum değer için bir.

Herkes kayıt formu gönderme izliyor ise o zaman onlar anlamaya edeceğiz endişeleriniz bilgiler var. İlk adım: formlar için HTTPS kullanın.

Şifreli db şeyler gelince, ben bir başkası onunla sorunu atalım edeceğiz. :-)

Benim endişe onlar ile imzalanan adınızı biliyorsanız eğer birisi oturuma yazmak ve böylece halklar sayfalarına erişmek mümkün olabilir mi? Bunu nasıl önlenmesi hakkında gitmek istiyorsunuz?

Ben ne demek emin değilim. Nasıl Biri "oturumuna yazmak" olur? Oturum [genellikle] istemci görüntülemek veya değiştirmek değil sunucuda depolanan bir dosyadır.

Eğer (fiksasyon aka) oturum kaçırma ile ilgili endişeleriniz varsa, o zaman SSL etkinleştirmek ve URL dizesinde oturum kimlikleri devre dışı bırakmanız gerekir. (session.use_only_cookies php.ini 'un bak)

4 - Her istek üzerine, ben veritabanını sorgulamak ve bu kullanıcı ile ilişkili site adını okumak için oturumunda saklanan kullanıcı adını kullanın. Daha sonra url kendisi site adı bu karşılaştırmak ve onlar geri kalanı için erişilebilir veya komut dosyası (değil global bir değişken olan bir değişken set eşleşen bir kullanıcı görebilirsiniz eğer, bu karar hangi benim denetleyicisi ile sadece okunabilir İki site adları eşleşen yoksa, kullanıcı giriş için belirli bir sayfa) geri yönlendirilir

Bu büyük endişe gibi geliyor. Site adı neye benziyor? Nasıl tam URL karşı eşleşen? Bir regex?

Erişim kontrolü kusurlu ise daha sonra kimlik kalitesi meselesi çok fazla değil, çünkü bu konu üzerinde biraz daha fazla detay, iyi olurdu.

Hiçbir şifre - Ben akış hakkı alırsanız ben adınızı ve site adını biliyorsanız, o zaman, site adı gidin ve (oturumları beri, tüm sonra, kurabiye gibi kaydedilir) size kullanıcı adı ile bir çerez verir, ben değilim gerekli? Bu bir kusur değil midir?