PHP 8.4.1 Released!

session_create_id

(PHP 7 >= 7.1.0, PHP 8)

session_create_idYeni bir oturum kimliği oluşturur

Açıklama

session_create_id(string $önek = ""): string|false

session_create_id() geçerli oturum için yeni bir oturum kimliği oluşturmak için kullanılır. Çakışmayan oturum kimliği döndürür.

Oturum etkin değilse çakışma denetimi yapılmaz.

Oturum kimliği php.ini ayarlarına uygun olarak üretilir.

Çöp toplayıcı (gc) görev betiği için http sunucusunun kullanıcı kimliğinin kullanılması önemlidir. Aksi takdirde, özellikle dosya kaydetme işleyicisinde izin sorunları yaşanabilir.

Bağımsız Değişkenler

önek

önek belirtilirse, yeni oturum kimliği bu önek ile başlar. Oturum kimlğinde her karaktere izin verilmez. Geçerli karakterler: a-z A-Z 0-9 , (virgül) ve - (tire). Azami uzunluk 256 karakterdir.

Dönen Değerler

session_create_id() geçerli oturum için çakışmayan yeni bir oturum kimliği döndürür. Etkin olmayan bir oturum için kullanılırsa çakışma denetimi yapılmaz. Başarısızlık durumunda false döner.

Örnekler

Örnek 1 - session_create_id() ile session_regenerate_id() örneği

<?php
// Oturum başlatma işlevimiz zaman damgası yönetimi de içeriyor
function my_session_start() {
session_start();
// Eski oturum kimliği kullanılmasın
if (!empty($_SESSION['deleted_time']) && $_SESSION['deleted_time'] < time() - 180) {
session_destroy();
session_start();
}
}

// Oturum kimliğini yeniden üretme işlevimiz
function my_session_regenerate_id() {
// Çakışmasız oturum kimliği üretilmesi için
// session_create_id() işlevini oturum etkinken çağırmalıyız
if (session_status() != PHP_SESSION_ACTIVE) {
session_start();
}
// UYARI: Önek için asla gizli kalması gereken verileri kullanmayın!
$newid = session_create_id('myprefix-');
// Silinmiş zaman damgasını ata. Oturum verisi sırf bu nedenle silinmesin
$_SESSION['deleted_time'] = time();
// Oturumu bitir
session_commit();
// Kullanıcı tanımlı oturum kimliği kabul edildiğinden emin olun
// BİLGİ: Normal işlemler için use_strict_mode etkin olmalıdır.
ini_set('session.use_strict_mode', 0);
// Yeni özel oturum kimliğini ata
session_id($newid);
// Yeni özel oturum kimliği ile oturmu başlat
session_start();
}

// use_strict_mode etkin olduğundan emin olun.
// use_strict_mode güvenli bir oturum için zorunludur.
ini_set('session.use_strict_mode', 1);
my_session_start();

// Oturum kimliğinin yeniden üretilmesini gerektiren durumlar:
// - Kullanıcı oturum açmışsa
// - Kullanıcı oturumu kapatmışsa
// - Belirlenen süre aşılmışsa
my_session_regenerate_id();

// Diğer işlemler ...
?>

Ayrıca Bakınız

add a note

User Contributed Notes 1 note

up
4
rowan dot collins at gmail dot com
6 years ago
This function is very hard to replicate precisely in userland code, because if a session is already started, it will attempt to detect collisions using the new "validate_sid" session handler callback, which did not exist in earlier PHP versions.

If the handler you are using implements the "create_sid" callback, collisions may be detected there. This is called when you use session_regenerate_id(), so you could use that to create a new session, note its ID, then switch back to the old session ID. If no session is started, or the current handler doesn't implement "create_sid" and "validate_sid", neither this function nor session_regenerate_id() will guarantee collision resistance anyway.

If you have a suitable definition of random_bytes (a library is available to provide this for versions right back to PHP 5.3), you can use the following to generate a session ID in the same format PHP 7.1 would use. $bits_per_character should be 4, 5, or 6, corresponding to the values of the session.hash_bits_per_character / session.sid_bits_per_character ini setting. You will then need to detect collisions manually, e.g. by opening the session and confirming that $_SESSION is empty.

<?php
function session_create_random_id($desired_output_length, $bits_per_character)
{
$bytes_needed = ceil($desired_output_length * $bits_per_character / 8);
$random_input_bytes = random_bytes($bytes_needed);

// The below is translated from function bin_to_readable in the PHP source (ext/session/session.c)
static $hexconvtab = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,-';

$out = '';

$p = 0;
$q = strlen($random_input_bytes);
$w = 0;
$have = 0;

$mask = (1 << $bits_per_character) - 1;

$chars_remaining = $desired_output_length;
while (
$chars_remaining--) {
if (
$have < $bits_per_character) {
if (
$p < $q) {
$byte = ord( $random_input_bytes[$p++] );
$w |= ($byte << $have);
$have += 8;
} else {
// Should never happen. Input must be large enough.
break;
}
}

// consume $bits_per_character bits
$out .= $hexconvtab[$w & $mask];
$w >>= $bits_per_character;
$have -= $bits_per_character;
}

return
$out;
}
?>
To Top