Session_regenerate_id () ne zaman ve neden kullanmalıyım?


96

PHP'de session_regenerate_id()işlevi neden ve ne zaman kullanmalıyım ? Onu kullandıktan sonra her zaman kullanmalı mıyım session_start()? Oturumu sabitlemek için kullanmam gerektiğini okudum, tek neden bu mu?


çünkü oturum başladıktan sonra oluşturulur ve diğer sayfada oturumu başlattığınızda değişkenler mevcuttur: -
HaRsH

@HaRsH Oo? Session_regenerate_id, eski oturum kimliğini kaldırır ve örneğin XSS ile oturumun ele geçirilmesini önlemek için yeni bir tane oluşturur. Diğer belgelerdeki SESSION değişkenlerinin görünürlüğü üzerinde herhangi bir etkisi yoktur.
Xatenev

evet, diğer değişkenler üzerinde hiçbir
etkim

1
Ancak bu, session_regenerate_id ile ilgili, session_start ile ilgili değil ...
Xatenev

1
Önerilen RFC'yi okumanızı öneririm: wiki.php.net/rfc/precise_session_management
jankal

Yanıtlar:


98

Nedir session_regenerate_id()?

İşlev adından da anlaşılacağı gibi, mevcut oturum kimliğini yenisiyle değiştirecek ve mevcut oturum bilgilerini koruyacak bir işlevdir.

Bu ne işe yarıyor?

Esas olarak oturum sabitleme saldırılarını önlemeye yardımcı olur. Oturum sabitleme saldırıları, kötü niyetli bir kullanıcının başka bir kullanıcının oturum kimliğini (SID) sabitlemek (ayarlamak) için bir sistemdeki güvenlik açığından yararlanmaya çalışmasıdır. Bunu yaparak, orijinal kullanıcı olarak tam erişim elde edecekler ve aksi takdirde kimlik doğrulama gerektiren görevleri yerine getirebilecekler.

Bu tür saldırıları önlemek için, kullanıcıya session_regenerate_id()başarılı bir şekilde oturum açtığında (veya her X isteği için) kullanarak yeni bir oturum kimliği atayın . Artık oturum kimliği yalnızca ondadır ve eski (sabitlenmiş) oturum kimliğiniz artık geçerli değildir.

Ne zaman kullanmalıyım session_regenerate_id()?

Symbecean'ın aşağıdaki yorumlarda işaret ettiği gibi, oturum kimliği kimlik doğrulama durumundaki herhangi bir geçişte ve yalnızca kimlik doğrulama geçişlerinde değiştirilmelidir.

Daha fazla okuma:


2
Ve hacker 20. aramayı yaparsa ne sona erecek? Oturum kimliği değiştirildi ve oturuma sahip olan tek kişi o;))
fred727

@ fred727 Bilgisayar korsanı 20. çağrıya ulaşacak kadar şanslıysa, kullanıcı geçersiz bir kimliğe sahip olacak ve artık kimliği doğrulanmayacaktır. Yenileme olmaksızın, hem hacker hem de kullanıcının kimliği doğrulanacaktır.
Bradmage

oturumlarda hassas bilgileri saklarken (yani yalnızca kimlik doğrulama geçişlerinde değil) session_regenerate_id çağrısı yapmak da yararlı olabilir
Adam

Oturum bilgisi çerezde değilse oturumu düzeltmek mümkün müdür? Oturum bilgilerini sunucumdaki dosyalarda saklıyorum, kimliği yeniden oluşturmak için gerekli mi?
Gonzalo

"başka bir kullanıcının oturum kimliğini (SID) sabitlemek (belirlemek) için" .... bu, başka bir kullanıcının bilgisayarında bir oturum kimliğini (SID) sabitlemek (ayarlamak) için "ile değiştirilmeli, ardından kullanıcı kimliğini doğruladıktan sonra kullanmalıdır "
Muhasebeci م

25

Oturum kaçırmayı ve oturumu sabitlemeyisession_regenerate_id() durdurmak için kullanmalısınız .

Gönderen bu Security.SE cevap :

Oturum kaçırma, oturum çerezinin çalınması anlamına gelir. Bu, yerel bir ağı diğer bilgisayarlarla paylaşırken en kolay şekilde başarılabilir. Örneğin, Starbucks'ta. Örnek ... Y oturumuna sahip bir kullanıcı James'in Starbucks'taki web sitesinde geziniyor. Latte'imi yudumlarken ağ trafiğini dinliyorum. Kullanıcıyı, James'in web sitesi için oturum Y'nin çerezleriyle alıyorum ve tarayıcımı bunları kullanacak şekilde ayarlıyorum. Şimdi James'in sitesine, James'in sitesine girdiğimde.

Gönderen bu web sayfası :

Oturum Sabitleme, bir kullanıcının oturum kimliğini açık bir değere zorlayan bir saldırı tekniğidir. Hedef web sitesinin işlevselliğine bağlı olarak, oturum kimliği değerini "düzeltmek" için bir dizi teknik kullanılabilir. Bu teknikler, Siteler Arası Komut Dosyası istismarlarından web sitesini önceden yapılmış HTTP istekleriyle karıştırmaya kadar uzanır. Bir kullanıcının oturum kimliği düzeltildikten sonra, saldırgan bu kullanıcının oturum açmasını bekleyecektir. Kullanıcı bunu yaptığında, saldırgan aynı çevrimiçi kimliği üstlenmek için önceden tanımlanmış oturum kimliği değerini kullanır.

Ne Zaman Kullanılmalı

Kullanıcı, site güvenliğini veya gizlilik politikasını tehlikeye atabilecek bazı önemli girdileri (şifreleri, kimlik bilgilerini, unutulan şifreleri vb.) Düzenlerken / güncellerken.

Ayrıca bakınız:

PHP Güvenlik Kılavuzu: Oturumlar

Oturum Tespiti (İyi okundu)


22

Bence seans zehirlenmesi meselesi oldukça iyi ele alındı.

"Bunu ne zaman kullanmalıyım?" Kısmen geri adım atmanız ve uygulamanızın oturumda ne yaptığını düşünmeniz önemlidir. Ya da başka bir deyişle, cevaplamanız gereken temel güvenlik sorusu budur.

Birisi bu seansı ele geçirirse ne kazanır?

Yaptığınız tek şey, aksi takdirde anonim verileri izlemekse (kullanıcı siteye gelir ve ziyaretlerini izlemek için kullanırsanız), bir oturumu yeniden oluşturmak için çok az neden vardır. Bir hava korsanı, o oturumu kaparak değerli bir şey kazanmaz.

Bununla birlikte, birçok site oturum açma olanağı sunar. Bir giriş birçok şeyi değiştirir. Profilime erişebilirim. Ayarları değiştirebilirim. Bu nedenle, bir saldırgan, özellikle normal ve yönetici kullanıcıların tümü oturumları yönetmek için oturumları kullanıyorsa, hesabıma erişimimi isteyebilir. Bu yüzden insanlar siteme gelip oturum açtıklarında oturumu yeniden oluşturuyorum. Yeni giriş yapan kullanıcımın ele geçirilme olasılığının daha düşük olduğu ekstra bir güvenlik katmanı ekler.

Bir oturuma her kritik veri eklediğimizde, oturum kimliğini yeniden oluşturmayı düşünmelisiniz. Uygulamanızı sabitlemeye karşı sertleştirmeniz gerekiyorsa, rastgele bir yenileme yararlı olabilir, ancak ASLA her talepte yeniden oluşturmam. Varsayılan olarak PHP, oturumları yerel diskteki dosyalarda depolar. Nispeten küçük bir saldırı vektörünü azaltmak için çok fazla disk G / Ç ekliyorsunuz. Gerçekten daha fazla güvenliğe ihtiyacınız varsa, düzenli olarak yenileme yerine tam HTTPS'ye geçmeyi savunurum (HTTPS, sabitlemeyi kaldırmayı çok zorlaştırır).


2
HTTPS, sabitlemede hiçbir şeyi değiştirmez.
kelunik

4
Ancak, ilk etapta oturum kimliğini almak için kullanılabilecek koklama saldırılarını zorlaştırır.
demonkoryu

php uygulamam saniyeler içinde oturumu kapatıyor, yenilenmeyi kullanıyorum, yapılabilecek oturum dosyalarının bir sınırı var mı veya oturumu kapatmaya neden olabilecek yeniden oluşturulmuş kimliklerde bir sınır var mı?
sqlchild

Genel olarak hayır.
Bununla

17

Neden kullanmalıyım session_regenerate_id?

Oturum sabitlenmesini önlemek için kullanmalısınız .

Ne zaman kullanmalıyım session_regenerate_id?

Kimlik doğrulama durumu her değiştiğinde, bu esas olarak oturum açma ve oturumu kapatma ile ilgilidir.

Misal

Bob halka açık bir bilgisayarda oturur ve stackoverflow.com'a göz atarak orada yeni bir oturum açar. Oturum kimliği bir tanımlama bilgisine kaydedilir ( httpOnlyjavascript üzerinden erişimi engellemek için bayrakla). Yığın Taşması'nın HTTPS'nin her zaman etkin olduğunu ve ayrıca securetanımlama bilgisi için bayrağın ayarlandığını düşünelim .

Şimdi seansı nasıl çalabiliriz?

Bob, oturum kimliğini yazar. Tarayıcıyı kapatmadan bilgisayarı terk eder. Şimdi Alice bu bilgisayara geliyor ve Stack Overflow'un zaten yüklendiğini görüyor. Şimdi giriş yapıyor.

Şimdi kullanmanız gereken aşamadayız session_regenerate_id. Oturum açma sırasında burada yeni bir oturum kimliği oluşturmazsanız, Bob, Alice'in oturumuna erişmek için yazdığı önceki oturumu kullanabilir ve şimdi Alice olarak oturum açabilir.


Ama o zamana kadar session_regenerate_id(), Alice Bob hesabına erişebilir mi? bu doğru mu?
Akam

2
@akam - Geç oldu, ama yanıt vermeye değer ... 1. Bob oturumu kapatmaz, Alice oturum açma bilgilerini kullanabilir - 2. Bob oturumu kapatır, Alice oturum açmaz, Alice oturum kimliğini kullanabilir, ancak verilerine erişmek için aktif oturum açma yok - 3. Bob oturumu kapatır, Alice oturum açar, Bob oturum kimliğini kullanır, etkin bir oturum açma vardır, Bob, Alice'in verilerine erişir. Ancak spesifik olmak gerekirse: komut dosyalarının güvenliğine bağlı olarak bir oturum kimliği, oturumu kapatılmış bir kullanıcının verilerine mutlaka erişebileceğiniz anlamına gelmez, ancak genel olarak söylendiğinde, bu olası ve yüksek bir risktir.
codekandis

15

Daha iyi güvenlik için kullanabilirsiniz.

Bu şekilde tek kullanımlık oturum kimlikleri oluşturursunuz.

Kullanıcı oturum kimliğinizin = 3 olduğunu varsayalım

Bir bilgisayar korsanı, müşterinizi hackledi ve oturum kimliğini aldı. Böylece bilgisayar korsanı, oturumlarını kullanmak için bu çerezi kullanabilir.

Gibi kodunuz varsa

session_start();
session_regenerate_id();

web sitenizi her kullandıklarında oturumlarını değiştirebilirsiniz.

Şimdi hacker sessionid = 3 alıyor

ama o bunu kullandıktan sonra seansı değiştirdiniz, böylece

kullanıcı oturum kimliği = 4 // kimlik

bilgisayar korsanı oturum = 3 // boş

Ancak küçük bir nokta var diyelim ki yeniden oluşturma yöntemini kullanıyorsunuz ve müşteriniz sadece web sitesine giriş yapıp tarayıcıyı kapatın veya pasif. Müşterinizin sessionid = 4'ü var ve eğer bilgisayar korsanı o kısımda çerez alırsa aynı sessionid'e sahip olacak.

Yukarıda açıklandığı gibi, bu yolla müşterinizi veri koklamaktan tek bir şekilde koruyabilirsiniz, ancak yine de bu sorunu tamamen çözmeyecektir.

Ancak SSL enc kullanırsanız çok güvenli olacaktır.

Kötü ingilizce için özür dilerim.


12

Basit bir kullanım durumu:

// User visits a webshop
$shopcart = new Cart();

Bir oturum başlatılır ve veritabanına bir giriş yapılır. Kullanıcının alışveriş sepeti, oturum kimliği ile tanımlanır.

// User orders items
$shopcart->add('123', 20);
$shopcart->add('124', 18);
$shopcart->add('127', 5);

Eklenen her ürün için alışveriş sepeti tablomda kayıt yapılır. Ayrıca oturum kimliği ile tanımlanır.

// User saves cart in order to use it later
$shopcart->save();

Kullanıcı sepetini kaydetmeye karar verdi. Şimdi kullanıcı kimliğine ekleniyor.

// Regenerate session id for user to be able to make a new cart
session_regenerate_id();

Oturum kimliği yeniden oluşturulur ve kullanıcı artık başka bir alışveriş sepeti oluşturmaya başlayabilir.


4

session_regenerate_id (): Oturum kimliği yeniden oluşturulamaz - oturum etkin değil

if(session_status() == PHP_SESSION_ACTIVE)
{
    session_regenerate_id();
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.