session_regenerate_id

(PHP 4 >= 4.3.2, PHP 5, PHP 7, PHP 8)

session_regenerate_idGeçerli oturum kimliğini yenisiyle değiştirir

Açıklama

session_regenerate_id(bool $eski_oturumu_sil = false): bool

session_regenerate_id() işlevi geçerli oturum kimliğini yenisiyle değiştirirken oturum bigisini korur.

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']);
}
?>

Ayrıca Bakınız