PHP Sessions tuz + Yönlendiren

8 Cevap php

Bu zihnimde gün son birkaç çalışmasını sürdürür, ama ben PHP oturumları daha güvenli hale getirmek için nasıl hakkında bazı makaleler okudum. Hemen hemen bütün bu makalelerin bir ek tuz İLE oturumda UserAgent kaydetmek gerektiğini söylüyorlar. Böyle bir şey:

$fingerprint = md5('SECRET-SALT'.$_SERVER['HTTP_USER_AGENT']);

Tuz zor bir saldırganın oturum kaçırmak ya da ne için yapmak istiyorum. Ama neden bir tuzdan, bu gibi kontrol ederim her zaman ekleyin:

md5('SECRET-SALT'.$_SERVER['HTTP_USER_AGENT']) == $_SESSION [ 'fingerprint' ]

Saldırgan hala sadece UserAgent (relativly farklı useragents küçük bir set olan) ve Sessionıd ihtiyacı beri Yani NEDEN tuz, daha güvenli yapmak istiyorsunuz?

Muhtemelen ben bakan değilim, ama onu anlamaya olamaz küçük bir şey, beni haha ​​deli

Teşekkürler!

8 Cevap

Bir tuz eklemek için önerilir ki nedeni basittir. Bu "parmak izi" oluştururken Genellikle, - sınırlı bir veri kümesi olan veri sadece tek öğe, kullanıyorsanız, o zaman daha kolay bir dış hacker bu oluşturmak ve oturumu kaçırmak için yapar.

Saldırgan "parmak izi" ve kullanıcı ajan hem de varsa Yukarıdaki örnekte, evet, sonra da oturumu kaçırmak mümkün olacak.

Bir tuz ekleme sadece) onlar bir bilgi parçası ama varsa ", sonra bilgi son parçası işe yaramaz hale edilir bir durum, zor bir saldırganın parmak izi oluşturmak için yapar

Ben Powered içinde, örneğin, (I üzerinde çalışmak için kullanılan bir proje) (temelde parmak izi gibi aynı) oturum kimliği karma Aşağıdaki kod ile oluşturulan biraz daha bir şeyler eklemek öneririm.

define('SESSION_IDHASH', md5($_SERVER['HTTP_USER_AGENT'] . $this->fetch_substr_ip($registry->alt_ip))); // this should *never* change during a session

Ayrıca, bir oturum karma kullanılarak oluşturulur

md5(uniqid(microtime(), true));

Oturumu belirlemeye çalışırken Bunlar hem kontrol edilir

Yani, oturumu kaçırmak için, kişi aşağıdaki bilmeniz gerekir

  • Oturumu oluşturuldu sunucuda süresi (tam)
  • Kullanıcıların Tarayıcı aracısı dizesi
  • Kullanıcının IP adresi

Onlar da bunu yapabilmek için IP adresini (ya da en azından ilk 2/3 sekizli) parodi gerekir.

Onlar yukarıdaki bilgileri almak başardınız bir noktada aslında iseniz, o zaman muhtemelen sadece oturum gaspına başka yollarla saldırı edebilmek olasıdır.

vBulletin aslında kendi başına bir "tuz" kullanmak istemiyorum, ama, sizin yukarıdaki örnekte, tuz sadece entropi sınırlı bir miktarda ekleyerek, bu mümkün olduğunca entropi bulmak her zaman en iyisidir.

Örneğin, ben şu anda python yazıyorum bir şey, ben XSRF koruma ile kullanım için bir karma oluşturmak. Aşağıdaki ben ne kullanın.

    self.key = sha1(
        self.user.username +
        self.user.password +
        settings.SECRET_KEY +
        strftime("%a, %d %b %Y %H:%M:%S +0000", gmtime())
    ).hexdigest()

Hangi kullanıcının kullanıcı adı ve parola, şimdiki zaman, ve bu oluşturmak için önceden ayarlanmış bir tuz alır. Bir saldırgan nedeniyle tuz üretmek için bu zor olurdu, ve zaman (gerçi, bu sadece kullanılan kez zamanla değişikliği gerçeği ile güvenli yapılmış olduğunu unutmayın, bir başkasına için çok almak olmaz değişiyor değilse belirli bir kullanıcı için bu crack)

Eğer kendi sunucusunda varsa onlar sunucusunun dışarı alamadım çünkü, oturum değişkenleri şifreleme, anlamsızdır. Daha fazla bilgi için What do I need to store in the php session when user logged in? için Linead cevaba bakınız. Eğer paylaşılan bir sunucuda iseniz, hepsi sizin komşular kullanarak aynı web sunucusu tarafından okunabilir geçici dosyaları saklanır çünkü, oturum kimliği yanı sıra, her oturum değişkenleri şifrelemek gerekebilir.

Eğer güvenlik konusunda gerçekten endişeli iseniz Neyse, daha iyi kendi (sanal veya değil) sunucusu ile, bu nedenle tehlike sadece sunucu dışından gelecek.

Oturumların risk bazı örnekler:

  • Sizin sunucu URL oturum kimliği gönderir ve kullanıcı Bunlar sunucu değişkenleri (sizin oturum kimliği de dahil olmak üzere tam URL) referer, tarayıcınızı ve kullanıcının IP adresini alacak badguys.com bir bağlantı izler. Eğer IP'leri kontrol etmiyor, ya da kullanıcı açık bir proxy kullanıyorsa, onlar sadece, aynı tarayıcı sürümünü yüklemek zorunda URL'sini yapıştırın, ve onlar bitti.
  • Kullanıcı bir kamu PC, oturumları gidin ve (hey, o sonuçta bir insan) onun oturumu kapatmadan bırakın. Arka arkaya gelecek adam, tarayıcıyı açar geçmişini kontrol ve açık oturumu bulur. Yuck.

Yani, bazı tedbirler sen benim her zamanki tercihinize göre, alabilir:

  1. URL oturum kimliğini etmeyin; session.use_only_cookies PHP etkinleştirin. Eksileri: Kullanıcı çerezleri etkinleştirmeniz gerekiyor.
  2. Tehlikeli eylemleri yeniden şifre için kullanıcı sormak, (... bir düzen yapmak, parolasını değiştirin). Siz de periyodik yapabilirsiniz. Eksileri: Sıkıcı.
  3. Hızlı zaman aşımı oturumları. Eksileri: Çoğu site bu onları rahatsız edici, sık sık giriş için zorlar.
  4. SSL (tek yolu saldırıları 'ortada adam' önlemek için) kullanın. Eksileri: Yavaş. Aptal tarayıcı mesajlar. Sunucuda SSL gerekir.
  5. IP kontrol edin. Eksileri: Bir kamu proxy kullanarak ziyaretçiler için Inneffective. Dinamik IP'ler için can sıkıcı.
  6. Kullanıcı aracısı (tarayıcı) kontrol edin. Eksileri: oldukça fazla işe yaramaz, UA almak kolay ve taklit saçmadır.

(Hafife Ben henüz PHP maksimum güvenlik için yapılandırılan alır).

Bazı daha aşırı önlemler:

  • Sunucu ve tarayıcı, örneğin arasında kalıcı bir bağlantı koruyun Bir Java uygulaması kullanarak. Bağlantı yok, hiç bir oturum. Eksileri: Kullanıcı Java, ActiveX veya ne olursa olsun kullanmak gerekiyor. Session (bu iyi olabilir) tarayıcısı ile kapatır. Çok yavaş bağlantılarda çalışmaz. Sunucu üzerinde yüksek yük. Sen, bağlantı noktalarını açmak için gereken uygulaması için özel bir sunucu var.
  • Aynı, ama çok sık oturumu yenilemek için zaman uyumsuz istekleri (örneğin AJAX) kullanan ve çok kısa bir zaman aşımı. Ya da gizli bir IFRAME ferahlatıcı. Eksileri: Kullanıcı JavaScript gerektirir. Çok yavaş bağlantılarda çalışmaz. Sunucu üzerinde yüksek yük.
  • Aynı, ama bütün sayfayı yeniden. Eksileri: Kullanıcı JavaScript gerektirir. Bir sayfayı okurken bir otomatik yeniden very can sıkıcı.

Bazı köşe durumlarda, oturumlar hakkında unutmak ve yerine Apache kimlik doğrulamasını kullanabilirsiniz. Basit çözüm, ancak sınırlamalar bir yeri.

Eğer doğru anlamak, oturum kimlikleri tahmin uzak bir saldırgan tarafından oturum ele engellemek istiyorsun?

Trafik snoop bir saldırganın da kullanıcı ajanı taklit edebilir, ve oturum depolama erişen bir saldırgan yine topları sizi sahiptir - bu durumda değilse, o zaman derinlik dışında ciddi vardır.

Tam kullanıcı aracısı dizesi dize karşılaştırma önemli ölçüde daha fazla (daha sonra karma ve daha sonra karşılaştırma) ve hızlı değil - Eğer geçerli kullanıcı ajan oturumu "kilitlemek" için kullanıcı aracısı dizesini saklıyorsanız, o zaman karma hiçbir nokta gerçekten var depolama açısından pahalıdır.

Ben kullanıcı aracısı yeterince farklılaşmasını sağlayan depolama inanmıyorum - Daha iyi bir şey oturumu başlangıç ​​zamanı (belki şimdiki zaman damgası + kullanıcı adı + kullanıcı aracısı + şey sha1) de (daha fazla bit ile) büyük bir kimlik oluşturmak olacaktır, daha sonra Bir çerez yanı sıra oturumda olduğunu saklamak ve her ek istek üzerine bu kadar maç. Bu (hala bazı sayısını tahmin etmek gerekir) çok saldırı vektörü değişmez, ama kolay önemli ölçüde kitlesel saldırı zorluk artırılması, orada başarılı bir saldırı için sanırım gereken bit sayısını artırmak için.

Ben Parmak izinizi tuzlama tek bir amaç görüyorum. Kötü bir adam senin session-db ele alırsa ancak o buna karşı ortak user-agent deneyerek parmakizi yöntemi "sanırım" ebil kodunuzu (neden tanrı bilir).

Ben bu kadar iyi yapmak partially protect from session impersonation attacks. Siz de IP adresini eklemeniz gerekir.

Unutmayın ki müşterinin tarayıcı otomatik kullanıcı aracısı değişiklik günceller ve onun oturum kaçırıldı olduğunu düşüneceğim zaman ;)

Parmak izi sunucu tarafında saklanır gibi, bir tuzlu karma kullanmanız gerekmez. "Normal" bir karma veri azaltmak için yeterlidir.

Unutmayın ki siz onların tarayıcınızı yükseltin tekrar giriş yapmak için insanları zorluyorlar bunu eğer. Bu Tamam olabilir ama sadece sizin niyet var emin olabilirsiniz.

Kullanıcının uzaktan adresini kullanarak ya da sorunsuz değildir. Birçok kişi farklı yerlerden aynı bilgisayarı kullanın. Mobil cihazlar, ev ve iş yerinde kullanılan dizüstü bilgisayarlar, dizüstü bilgisayarlar vb Wifi noktaları ve en kullanılmaktadır. Yeni bir IP adresi giriş unless you're dealing with highly sensitive information gibi online bankacılık gibi gerektiren böyle bir şekilde bir IP adresi kullanmak için kötü bir fikir IMHO. Durum böyle mi?

Eğer endişe nelerdir? Harici saldırı? Veya paylaşılan bir bilgisayar durumda Birisi oturum bilgilerini okuyabilir ki?

Bu ikincisi ise, çözüm basit: sadece oturumda duyarlı bir şey saklamak yok. Duyarlı bir şey veritabanında saklanmalıdır.

Gizli tuz oluşturma açısından, guessable olmayan bir şey kullanmak gerekir. Ben kullanıcı oluşturulduğunda yarattığı rastgele bir dize gibi bir şey için giderdim. Gerekirse o oturumu geçersiz her zaman yeniden.

Onu daha güvenli kılacak ne gelince, bunu kendiniz söyledi: sınırlı kullanıcı aracısı dizeleri (az yüz muhtemelen kullanıcıların% 99.99 kapsayacak) vardır. Bir tuz sadece olasılıkların sayısını artırır. Yani tüm oturumlar için aynı tuz kullanırsanız bu kaba güçle bulunursa önce o zaman sadece bir meselesi, söyleniyor.

Tamam, mesela ben şu kurgusal kodu kullanıyorum:

<?php

// The sessionid cookie is now a certain hash
if ( array_key_exists ( $_COOKIE [ 'sessionid' ] ) )
{
	// Get the session from database
	$db_sessid = $pdo -> getStuff ( 'session_database', $_COOKIE [ 'sessionid' ] );

	if ( $db_sessid !== null && $db_sessid [ 'fingerprint' ] == sha1 ( 'SOMESALT' . $_SERVER [ 'HTTP_USER_AGENT' ] ) )
	{
		set_cookie ( ... ); // New sessionid and write also to DB

		// User is now logged in, execute some user stuff
	}
	else
	{
		// Session doesn't exist, or the fingerprint does not match
	}
}

Şimdi saldırganın tek hala (HTTP başlıklarını birlikte gönderilir) çerez olduğunu Sessionıd ve UserAgent gerekiyor. Peki hala ek tuz noktası?

IP en denetleniyor bence böyle iyi bir seçenek olarak da, bazı sağlayıcılar ya da vekil Onlara her isteği değiştirin.

Teşekkürler kadar (-: