Güvenli bir PHP giriş ve kimlik stratejisi geliştirilmesi

7 Cevap php

Ben, yeni bir PHP sitesi için bir giriş ve kimlik doğrulama sistemi geliştiriyorum ve çeşitli saldırılar ve güvenlik açıkları üzerine okuma olmuştur. Ancak, biraz kafa karıştırıcı, bu yüzden benim yaklaşım mantıklı olmadığını kontrol etmek istiyorum.

Ben aşağıdaki verileri depolamak planı:

  • In the session: user-id, karma + tuzlu HTTP_USER_AGENT

  • In the cookie and in the database: rastgele belirteç, karma + tuzlu tanımlayıcı

Her sayfasında, aşağıdaki yapmayı planlıyoruz:

  1. If a session exists, authenticate using that. HTTP_USER_AGENT depolanan oturumda eşleşmesine dikkat edin.

  2. If no session exists, use the cookie to authenticate. çerez belirteci ve tanımlayıcı veritabanında uyuştuğunu kontrol edin.

  3. If the cookie is invalid or doesn't exist, ask user to login.

Bu herhangi bir bariz kusurları var mı? Sürece Ben çerez bir zaman aşımını ayarlamak gibi, ben sağ oldukça güvenli olmalı? Ben eksik bir şey var mı?

Şimdiden çok teşekkürler.

7 Cevap

Birkaç rastgele düşünceler:

  1. Ne (web sitenizin bazı JS kod enjekte ederek bir XSS saldırısı kullanarak) kullanıcıların birinin çerez çalmak olur? Ben o zaman gerçekten güvenli bir kimlik doğrulama istiyorsanız, mağaza kullanıcı kimlik bilgileri-tipi tanımlama "beni hatırla" kullanmak istemiyorum, olgu 2'ye düşecek. Ve böylece IMHO oturum mümkün olacak.
  2. Eğer bir tanımlama kimlik bilgilerini depolamak yaparsanız, net olarak şifre saklamak etmeyiniz.
  3. HTTP_USER_AGENT denetleniyor oturum ele önlemek için iyi bir ilk adımdır, ama belki bir IP adresi ile birleştirmek olabilir? Bu çok daha zor sadece aynı tarayıcıyı kullanmak için daha hedef daha aynı ana olmaktır.

Ama her durumda, iyi bir kimlik doğrulama şeması hakkında düşünme zaman ayırdığınız için teşekkürler. PHP geliştiricileri bir sürü yok.

EDIT: kayıt için, beni burada bir noktaya açıklık getirelim: iki çerezler bu discusion de vardır. Oturum kimliğini yaymak için PHP tarafından otomatik olarak ayarlanan bir (bazen, biz web siteleri [...] örneğin www.example.com/page.php?sessionId = URL koyarak bakınız), ve sizin tarafınızdan oluşturulan ikinci bir kullanıcı kimlik bilgilerini saklamak ve oturum kaybolduğunda onu doğrulamak için. Bir saldırganın oturum tanımlama çalmak ve (sınırlı bir ömrü vardır) oturumu kaçırmak, ya da kimlik çerez çalmak ve daha sonra kimlik doğrulaması olabilir ya yani XSS saldırı için de geçerlidir.

olmamalıdır. php oturum on your server değil kullanıcı saklanır. php simpily buna bir oturum tanımlama işaret bırakır. Eğer oturumu hosting üzerinde değilseniz bile karma olmak zorunda değildir.

joe

Veritabanında çerez saklama bir HORRILBE fikirdir. Bir saldırganın bir SQL injection açığı olsaydı hemen bir karma parola çatlamak kalmadan erişmek anlamına gelir.

Eğer md5 () kullandığınızda size saldırmaya teknik savunmasız ve bir CVE numarası verilmiş olabilir, parolalar için sha256 kullanmanız gerekir konuşan hangi.

Kendi Session id üretmek ASLA, session_start () ve $ _SESSION süper global kullanın.

Bu insanları yönlendirmek için güvenli bir yoldur. Başlığında sonra ölmek istemiyorsanız () php kodun geri kalanı hala, normal tarayıcılar tarafından görüntülenen bile olsa yürütülür (hackerlar hala görüyorum :)

header("location: index.php");
die();

To be honest if security confuses you, don't write security systems. People have written more than 1,000 login systems for PHP alone and the majority are vulnerable. This project has a secure authentication system: http://code.google.com/p/michael-the-messenger/downloads/list

Olmak istediğiniz kadar güvenli bağlıdır ..

Cross-site vulnerabilities: Lets say another site directs the browser to submit a form to your site that does something like posting spam (or worse) if that user is already logged on the form submission will work. You'll need to check referer and a generated hidden formID for each form to protect against this fully.

İkincisi: Eğer orta trafik yüksek varsa, SessionIDs tekrarlanan ya da tahmin edilebilir, ben kullanıcıların kurabiye saklanan kimliği oluşturulan ikinci el karşı kontrol ediyorum.

Katma karmaşıklığı size işlevsellik ya da güvenliğinin şey elde etmediğini de düzeni, birkaç yolla gereksiz karmaşık görünüyor.

  1. Tarayıcı (örneğin kurabiye, User-agent) tarafından gönderilen herhangi bir veri spoofable olduğunu. Saldırgan sahte kullanıcı olarak aynı NAT arkasında ve saldırganın farklı bir tarayıcı kullanarak ancak User-agent değiştirmek düşünmüyor zaman User-agent kontrolü, sadece yardımcı olacaktır.
  2. Oturumlar kurabiye veya bir URL sorgu parametresini kullanarak session id istemci tarafında saklamak. Eğer, bir oturumun ömrünü uzatmak etrafında uzun oturum tanımlama tutmak için session_set_cookie_params kullanmak istiyorsanız.

User-agent gizli verileri değil, bu yüzden karma gereksiz olduğunu.

Uzak IP kontrol oturumu kurabiye + yakalamak olmayacağından saldırılar şunlardır:

  1. saldırganın kullanıcı olarak aynı NAT arkasında
  2. Saldırganın kullanıcının IP sahtesi kör enjeksiyon saldırıları. Sadece yazma olmasına rağmen, bu hala bazı hasar yapabilir.
  3. Böyle cross-site request forgery (CSRF) olarak kullanıcının kendi tarayıcısı kullanımı, yapmak saldırılar.

Eğer isteği tamamlamadan önce cevap gereken kullanıcının tarayıcısına, bir meydan okuma göndermenin bir yolunu çalışabilirsiniz eğer 2) önlenebilir, ancak istemci yazmadım bu zordur. AJAX ile bu yapılabilir. 3) (MindStalker tarafından belirtildiği gibi) CSRF saldırıları keyfi başlıkları etkileme yeteneği yok ve XMLHttpRequest Referer başlık {başına (ayarlanabilir izin olmamalı, çünkü çalışır Referans başlığını kontrol ederek önlenebilir [(0)]}, uygulamaları uyumlu olmayabilir gerçi). Iframe'ler ile, bir Referans onay almak mümkün olabilir. Ayrıca, Referer başlık istemci tarafı bloke olabilir.

Çoğu site sadece PHP oturum kullanmak; oturum verileri ($ _SESSION) a file your sunucu üzerinde bulunmaktadır. Tarayıcıya gönderilen tüm bir oturum kimliktir. Oturumuna her isteğini yeniden emin olun (session_regenerate_id). Siz iki tanımlama ya da bir şey gönderme gerekmez.

Her isteği, yeni bir kimlik, yani bir saldırgan tarafından yakalanan eski bir işe yaramaz olduğu gibi bu oturum gaspına karşı daha az savunmasız değildir.

En iyi çözüm, açıkçası, bütün oturum boyunca SSL kullanmak olacaktır.

IMHO oturumu bilgiler bir başarı giriş yaptıktan sonra değişmiş olması da önemlidir. Bir veritabanı oturumu bilgilerini kaydetmek için enjeksiyonlar bir tasarruf değildir.