SORU
6 ŞUBAT 2009, Cuma


Nasıl 30 dakika sonra bir PHP oturum sona erecek?

Oturumu canlı olarak 30 dakika tutun ve sonra onu yok etmek istiyorum.

CEVAP
13 AĞUSTOS 2009, PERŞEMBE


Kendi oturum zaman aşımı uygulamak gerekir. Her iki seçenek de diğerleri (session.gc_maxlifetime session.cookie_lifetime) ile belirtilen güvenilir değildir. Bunun nedenlerini açıklayacağım.

İlk:

oturum.gc_maxlifetime
oturum.gc_maxlifetimesonra veri 'çöp' ve temizledik. olarak görülecektir saniye sayısını belirtir Çöp toplama oturumu başlatma sırasında oluşur.

Ama çöp toplayıcı sadece session.gc_probability olasılık session.gc_divisor bölü ile başladı. Ve bu seçenekler için varsayılan değerleri kullanarak (1 ve 100 sırasıyla), şansı %1 sadece.

Peki, sadece çöp toplayıcı daha sık başladı, böylece bu değerleri ayarlamak olabilir. Ama çöp toplayıcısı çalıştırıldığında, her kayıtlı oturum için geçerliliğini kontrol edecektir. Ve maliyet-yoğun bir iştir.

PHP session.save_handler varsayılan dosyaları kullanırken ayrıca, oturum veri yolu session.save_path belirtilen dosyaları olarak depolanır. Bu oturum işleyicisi ile, oturum verileri yaş, dosyanın en son değiştirilme tarihine göre hesaplanan ve son erişim tarihi:

Not:Eğer varsayılan dosya tabanlı oturum işleyicisi kullanıyorsanız, dosya erişim süreleri (atime) takip etmelidir. Windows FAT atime izleme bulunmadığı çöp eğer bir FAT dosya sistemi ile sıkışmış oturum toplama veya herhangi bir diğer dosya işlemek için başka bir yol ile gelmek zorunda kalacak kadar değil. PHP 4.2.3 beri mtime (değiştirilme tarihi) yerine atime kullandılar. Yani, atime izleme bulunmadığı dosya sistemleri ile bir sorun olmaz.

Ayrıca oturum veri dosyası hala oturum veri olarak geçerli kabul kendisi oturuma son güncellenen değil iken silinmiş olduğu ortaya çıkabilir.

Ve ikinci:

oturum.cookie_lifetime
oturum.cookie_lifetimebelirtir tarayıcıya gönderilen saniye içinde çerez ömrü. [...]

Evet, bu doğru. Bu sadece çerez ömür boyu ve hala geçerli olabilir oturumunu etkiler. Ama sunucunun oturumu geçersiz kılmak için görev, istemcinin değil. Bu hiçbir şeye yardımcı olmuyor. Aslında, sahipoturum.cookie_lifetime0 ayarlı oturumu cookie yapacak tarayıcı kapatılana kadar geçerlidir session cookie bir gerçek.

Sonuç / en iyi çözüm:

En iyi çözüm kendi oturum zaman aşımı uygulamak için. Her talebi son etkinliği (yani talep) zamanı gösterir ve güncellemek için basit bir zaman damgası kullanın:

if (isset($_SESSION['LAST_ACTIVITY']) && (time() - $_SESSION['LAST_ACTIVITY'] > 1800)) {
    // last request was more than 30 minutes ago
    session_unset();     // unset $_SESSION variable for the run-time 
    session_destroy();   // destroy session data in storage
}
$_SESSION['LAST_ACTIVITY'] = time(); // update last activity time stamp

Her isteği ile oturum verileri güncelleştirme oturumun çöp toplayıcısı tarafından zamanından önce kaldırıldı, ayrıca oturum dosyanın değiştirilme tarihini değiştirir.

Ayrıca oturum KİMLİĞİ belirli aralıklarla session fixation gibi oturumlarda saldırıları önlemek için yeniden oluşturmak için ek zaman damgası kullanabilirsiniz:

if (!isset($_SESSION['CREATED'])) {
    $_SESSION['CREATED'] = time();
} else if (time() - $_SESSION['CREATED'] > 1800) {
    // session started more than 30 minutes ago
    session_regenerate_id(true);    // change session ID for the current session and invalidate old session ID
    $_SESSION['CREATED'] = time();  // update creation time
}

Notlar:

  • session.gc_maxlifetime en azından bu özel sona erme işleyicisi (bu örnekte 1800) süresi eşit olmalıdır;
  • 30 dakika sonra oturum sona istersenizfaaliyetyerine 30 dakika sonrabaşladığından beriayrıca setcookie kullanmanız gerekir , Bir time() 60*30 oturum tanımlama aktif tutmak için sona erer.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Mega64

    Mega64

    24 ŞUBAT 2006
  • placeboing

    placeboing

    7 Mart 2006
  • UCBerkeley

    UCBerkeley

    3 Mayıs 2006