session_regenerate_id
(PHP 4 >= 4.3.2, PHP 5, PHP 7, PHP 8)
session_regenerate_id — Geçerli oturum kimliğini yenisiyle değiştirir
Açıklama
function session_regenerate_id(
bool $eski_oturumu_sil = false):
bool
session.use_trans_sid
etkin olduğunda, çıktı session_regenerate_id()
çağrısından sonra başlatılmalıdır. Aksi takdirde, eski oturum kimliği
kullanılır.
Uyarı
Şu an için, işlev Mobil veya WiFi ağları gibi dengesiz ağlarda düzgün
çalışmamaktadır. Bu bakımdan, işlev böyle ağlarda çağrıldığında bir oturum
kaybı yaşanabilir.
Eski oturum verisini değil, eski oturumun zaman damgasını hemen yok etmeli
ve eski oturum kimliğine erişimi denetlemelisiniz. Aksi takdirde, sayfaya
eşzamanlı erişimler tutarsız bir duruma veya oturum kaybına yol açabilir.
Ya da, istemcinin (tarayıcı) yarış durumu yan etkisi nedeniyle, gereksiz
yere çok sayıda boş oturum kimliği çerezi oluşturmasına sebep olabilir.
Eski oturum verisinin hemen silinmesi ayrıca oturum ele geçirme saldırısını
algılamayı ve önlemeyi devre dışı bırakır.
Bağımsız Değişkenler
eski_oturumu_sil
-
true ise eski oturum verisi silinir. Yarış durumlarından kaçınmak
ve oturum ele geçirme saldırılarını algılamak/önlemek için
eski oturum hemen silinmemelidir.
Dönen Değerler
Başarı durumunda true, başarısızlık durumunda false döner.
Örnekler
Örnek 1 - session_regenerate_id() örneği
<?php
// Dikkat: Bu kod tamamen çalışır durumda değildir, sadece bir örnektir!
session_start();
// Zaman damgası yok edilmiş mi?
if (isset($_SESSION['destroyed'])
&& $_SESSION['destroyed'] < time() - 300) {
// Normalde olmamalı. Saldırı veya kararsız ağ nedeniyle olabilir.
// Bu kullanıcı oturumunun tüm kimlik kanıtlama bilgilerini sil.
remove_all_authentication_flag_from_active_sessions($_SESSION['userid']);
throw(new DestroyedSessionAccessException);
}
$old_sessionid = session_id();
// Silinme zamanı damgasını tanımla
$_SESSION['destroyed'] = time();
// session_regenerate_id() eski oturum verisini kaydeder
// session_regenerate_id() basitçe çağrılırsa oturum kaybı oluşabilir, vs.
// Sonraki örneğe bakın
session_regenerate_id();
// Yeni oturumun silinme zamanı damgasına ihtiyacı yok
unset($_SESSION['destroyed']);
$new_sessionid = session_id();
echo "Eski oturum: $old_sessionid<br />";
echo "Yeni oturum: $new_sessionid<br />";
print_r($_SESSION);
?>
Geçerli oturum modülü tutarsız ağda iyi çalışmaz. İşlevin oturumu
kaybetmesinden kaçınmak için oturum kimliği yönetilmelidir.
Örnek 2 - session_regenerate_id() ile oturum kaybını önlemek
<?php
// Dikkat: Bu kod tamamen çalışır durumda değildir, sadece bir örnektir!
// my_session_start() ve my_session_regenerate_id() tutarsız ağda
// oturum kaybını önler. Ek olarak bu kod, çalınan oturumun saldırganlar
// tarafından suistimal edilmesini engelleyebilir.
function my_session_start() {
session_start();
if (isset($_SESSION['destroyed'])) {
if ($_SESSION['destroyed'] < time()-300) {
// Normalde olmamalı. Saldırı veya kararsız ağ nedeniyle olabilir.
// Bu kullanıcı oturumunun tüm kimlik kanıtlama bilgilerini sil.
remove_all_authentication_flag_from_active_sessions($_SESSION['userid']);
throw(new DestroyedSessionAccessException);
}
if (isset($_SESSION['new_session_id'])) {
// Süre henüz dolmadı. Kararsız ağda çerez kaybı olabilirdi.
// Uygun oturum kimliği çerezini yeniden tanımlamayı dene.
// Dikkat: Kimlik kanıtlama bilgilerini silmek için
// oturum kimliğini yeniden atamaya çalışma!
session_commit();
session_id($_SESSION['new_session_id']);
// Yeni oturum kimliği etkinleşmeli
session_start();
return;
}
}
}
function my_session_regenerate_id() {
// Tutarsız ağdan dolayı oturum kimliği atanamadığında
// doğru oturum kimliğini tanımlamak için yeni oturum kimliği gerekir.
$new_session_id = session_create_id();
$_SESSION['new_session_id'] = $new_session_id;
// Silinme zamanı damgasını tanımla
$_SESSION['destroyed'] = time();
// geçerli oturuma yaz ve kapat;
session_commit();
// Oturumu yeni oturum kimliği ile başlat
session_id($new_session_id);
ini_set('session.use_strict_mode', 0);
session_start();
ini_set('session.use_strict_mode', 1);
// Yeni oturumun bunlara ihtiyacı yok
unset($_SESSION['destroyed']);
unset($_SESSION['new_session_id']);
}
?>