SessionHandler sınıfı

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

Giriş

SessionHandler, mevcut dahili PHP oturum kaydetme işleyicisini kalıtım yoluyla oluşturmak için kullanılabilecek özel bir sınıftır. Yedi dahili oturum kaydetme işleyicisi geriçağırımlarını sarmalayan yedi yöntemi vardır (open, close, read, write, destroy, gc ve create_sid). Öntanımlı olarak, bu sınıf, genellikle öntanımlı değeri files olan session.save_handler yapılandırma yönergesi tarafından tanımlandığı gibi dahili kaydetme işleyicisine ne atanmışsa onu sarmalar. Diğer dahili oturum kaydetme işleyicileri, SQLite (sqlite olarak), Memcache (memcache olarak) ve Memcached (memcached olarak) gibi PHP eklentileri tarafından sağlanır.

SessionHandler sınıfının düz bir örneği session_set_save_handler() kullanılarak kaydetme işleyicisi olarak atandığında, geçerli kaydetme işleyicilerini sarmalar. SessionHandler sınıfından genişletilen sınıf, ebeveynin yöntemlerini geçersiz kılmanıza veya dahili PHP oturum işleyicilerini sarmalayan ebeveyn sınıfın yöntemlerini çağırarak genişletilen sınıfın yöntemlerini engellemenize veya filtrelemenize olanak tanır.

Bu, örneğin, oturum verilerini şifrelemek/şifresini çözmek için read ve write yöntemlerini engellemenize ve ardından sonucu ebeveyn sınıfa ve ebeveyn sınıftan iletmenize olanak tanır. Bundan başka, gc çöp toplama geriçağırımı gibi bir yöntemi tamamen geçersiz kılmayı da seçebilirsiniz.

SessionHandler mevcut dahili kaydetme işleyicisi yöntemlerini sarmaladığından, yukarıdaki şifreleme örneği, işleyicilerin iç yapısını bilmek zorunda kalmadan herhangi bir dahili kaydetme işleyicisine uygulanabilir.

Bu sınıfı kullanmak için, önce session.save_handler ini yönergesini kullanarak oluşturmak istediğiniz kaydetme işleyicisini atayın ve ardından SessionHandler nesnesini veya işleyiciyi session_set_save_handler() işlevine genişleten bir nesneyi aktarın.

Bu sınıfın geriçağırım yöntemlerinin PHP tarafından dahili olarak çağrılmak üzere tasarlandığı, kullanıcı tarafından kod içinde kullanılmak üzere tasarlanmadığı unutulmamalıdır. Dönüş değerleri PHP tarafından dahili olarak işlenir. Oturum iş akışı hakkında daha fazla bilgi için session_set_save_handler() belgesine bakılabilir.

Sınıf Sözdizimi

classSessionHandlerimplementsSessionHandlerInterface, SessionIdInterface {
publicclose(): bool
publicdestroy(string$kimlik): bool
publicgc(int$azami_ömür): int|false
publicopen(string$yol, string$isim): bool
publicread(string$kimlik): string|false
publicwrite(string$kimlik, string$veri): bool
}
Uyarı

Bu sınıf, mevcut dahili PHP oturum kaydetme işleyicisini oluşturmak için tasarlanmıştır, eğer kendi özel kaydetme işleyicilerinizi yazmak istiyorsanız, SessionHandler sınıfını genişletmek yerine SessionHandlerInterface arayüzünü gerçekleyin.

Örnek 1 - Dahili PHP oturum kaydetme işleyicilere şifreleme eklemek için SessionHandler kullanımı

<?php


function decrypt($edata, $password) {
$data = base64_decode($edata);
$salt = substr($data, 0, 16);
$ct = substr($data, 16);

$rounds = 3; // anahtar uzunluğuna bağlı
$data00 = $password.$salt;
$hash = array();
$hash[0] = hash('sha256', $data00, true);
$result = $hash[0];
for (
$i = 1; $i < $rounds; $i++) {
$hash[$i] = hash('sha256', $hash[$i - 1].$data00, true);
$result .= $hash[$i];
}
$key = substr($result, 0, 32);
$iv = substr($result, 32,16);

return
openssl_decrypt($ct, 'AES-256-CBC', $key, true, $iv);
}


function encrypt($data, $password) {
// random_bytes() kullanarak kriptografik olarak güvenli rastgele tuz üret
$tuz = random_bytes(16);

$salted = '';
$dx = '';
// key(32) ve iv(16) = 48 tuz
while (strlen($salted) < 48) {
$dx = hash('sha256', $dx.$password.$salt, true);
$salted .= $dx;
}

$key = substr($salted, 0, 32);
$iv = substr($salted, 32,16);

$encrypted_data = openssl_encrypt($data, 'AES-256-CBC', $key, true, $iv);
return
base64_encode($salt . $encrypted_data);
}

class
EncryptedSessionHandler extends SessionHandler
{
private
$key;

public function
__construct($key)
{
$this->key = $key;
}

public function
read($id)
{
$data = parent::read($id);

if (!
$data) {
return
"";
} else {
return
decrypt($data, $this->key);
}
}

public function
write($id, $data)
{
$data = encrypt($data, $this->key);

return
parent::write($id, $data);
}
}

// yerel 'files' işleyicisini alıkoyacağız, ancak PHP eklentileri tarafından
// sağlanan 'sqlite', 'memcache' veya 'memcached' gibi diğer dahili yerel
// işleyicilerle eşit şekilde çalışacak.
ini_set('session.save_handler', 'files');

$key = 'secret_string';
$handler = new EncryptedSessionHandler($key);
session_set_save_handler($handler, true);
session_start();

// $_SESSION'daki anahtarla değerleri atamaya ve almaya devam et

Bilginize:

Bu sınıfın yöntemleri, normal oturum iş akışının bir parçası olarak PHP tarafından dahili olarak çağrılacak şekilde tasarlandığından, ebeveyn yöntemlere (yani gerçek dahili yerel işleyiciler) yapılan çocuk sınıf çağrıları, oturum gerçekten başlatılmadığı sürece (otomatik olarak veya doğrudan session_start() çağrısıyla) false döndürür. Sınıf yöntemlerinin kodunuzun içinden çağrılabileceği birim denemelerini "yaparken bunun dikkate alınması önemlidir.

İçindekiler

To Top