//Geçerli komut dosyası için oturum verilerini temizle: $_SESSION = ; //Kimliğe karşılık gelen çerezi silin: @unset($_COOKIE); //oturum depolama alanını sil: session_destroy();
Bir oturumun silinmesini neden 3 aşamaya ayırmanın gerekli olduğunu anlamak için neyin var olduğunu, nerede ve nerede kaydedildiğini bulalım.
Daha anlaşılır olması açısından her türlü oturum verisinin depolandığı tüm yerleri tanımlayalım:
Koterov'dan:
Betik sona erdiğinde PHP, adı SID'de saklanan $_SESSION dizisini otomatik olarak geçici belleğe kaydeder.
dizideki verilerin depoya yazıldığı anlamına gelir $_SESSION, eğer içinde varsa.
Onlar. şunu söyleyebiliriz:
Eğer session_destroy()çağrılmayacak ve çerezler temizlenmeyecek, ardından komut dosyası tekrar başlatıldığında, daha önce depoya yazılan veriler depoda görünecektir. $_SESSION, betiği çalıştırırken bile manuel olarak $_SESSION onları eklemeyeceksin.
// Mevcut script çalıştırmasındaki oturum verilerini temizlemek için bu satırı yazıyoruz $_SESSION = ; //Bu satır SID'yi kaldırır @unset($_COOKIE); //Oturum depolama alanını siler: session_destroy();
İnternette oturumların ne olduğu, ne için oldukları ve onlarla nasıl çalışılacağı hakkında binlerce eğitim bulabilirsiniz. Ancak maalesef bunları okuduktan sonra hala birçok soru kalıyor. Bana göre her şeyi anlamanın en kolay yolu seansların nasıl çalıştığına içeriden bakmaktır. Onlar. tarayıcı ve web sunucusu değişim günlüklerini inceleyin ve ayrıca istemci tarafında ve sunucu tarafında hangi verilerin depolandığını görün.
Bundan sonra pek çok nokta daha netleşiyor, çalışma mekanizması da daha şeffaf hale geliyor.
Aşağıdaki standart komut dosyasını kullanarak oturumların çalışmalarını inceleyeceğiz:
Bu şekilde çalışır:
Blok 1. session_start() işlevi, benzersiz oturum tanımlayıcısı PHPSESSID'yi kullanarak yeni bir oturum oluşturur veya eskisini yükler.
Blok 2. Oturum geri yüklendiyse $_SESSION["views"] değeri bir artırılır. Değilse, bir olarak başlatılır.
Teorik olarak tarayıcıda çerez desteği etkinse mekanizmanın çalışması gerekir ve sayfa her yenilendiğinde sayaç değeri bir birim artacaktır.
Tarayıcı orijinal istekte kendisini hiçbir şekilde tanımlamadığından mekanizma PHP oturumları yeni bir benzersiz oturum tanımlayıcısı oluşturdu ve tarayıcıya aynı tanımlayıcının saklanacağı bir çerez oluşturma komutunu verdi.
Sunucu tarafında çalışan script sonucunda aşağıdaki içeriğe sahip bir sess_k33en6ccgcia7125mitj5te4u6 dosyası oluşturulur:
İstemci tarafında, benzersiz oturum tanımlayıcısının değerini saklayan bir PHPSESSID çerezi oluşturulur.
Not. Varsayılan PHP ayarlarıyla, PHPSESSID çerezinin ömrü tarayıcı kapatılana kadardır. Onlar. Tarayıcı kapatıldığı anda çerez silinecek ve oturum kaybedilecektir. PHPSESSID çerezinin ömrü, session.cookie_lifetime değeri değiştirilerek değiştirilebilir.
Tarayıcı, PHPSESSID çerezini web sunucusuna gönderir ve bu çerezi kullanarak PHP, sess_k33en6ccgcia7125mitj5te4u6 dosyasındaki değerlerle $_SESSION dizisini başlatır. Buna göre blok 2'de IF (direkt) dalı işlenir.
Betiğin çalıştırılması sonucunda sess_k33en6ccgcia7125mitj5te4u6 dosyasının içeriği değişir:
Client tarafında değişen bir şey yok.
Tarayıcı kapatılmadan önce yapılan sonraki sayfa yüklemeleri, ikinci komut dosyası yüklemesinin işleyişine benzer şekilde çalışacaktır.
Çünkü Çerezin ömrü mevcut tarayıcı oturumuyla sınırlı olduğundan, kapatıldıktan sonra benzersiz oturum tanımlayıcısı kaybolacak ve yeniden başlatıldığında süreç yeniden başlayacaktır.
Ancak, PHPSESSID'yi bir kod parametresi olarak açıkça belirtirseniz kayıtlı bir oturuma geri dönebilirsiniz:
Oturuma dönüş oldukça şartlı, çünkü... Betiğin çalışması sonucunda bu durumda herhangi bir çerez oluşturulmaz. Sunucu yanıt başlıkları:
HTTP/1.1 200 Tamam Tarih: 29 Eylül 2011 Per 21:01:52 GMT Sunucu: Apache/2.2.13 (Win32) PHP/5.2.10 X-Powered-By: PHP/5.2.10 Sona erme tarihi: 19 Kasım Per 1981 08:52:00 GMT Önbellek Kontrolü: saklama yok, önbellek yok, yeniden doğrulama gerekir, sonradan kontrol=0, ön kontrol=0 Pragma: önbellek yok İçerik Uzunluğu: 58 Canlı Tutma: zaman aşımı= 5, max=100 Bağlantı: Canlı Tutma İçerik Türü: text/html
Onlar. Bu özel oturumla çalışmayı sürdürmek için tüm bağlantıların atanması gerekecek?PHPSESSID=k33en6ccgcia7125mitj5te4u6.
Not. PHP'ye yalnızca benzersiz oturum tanımlayıcısını bir çerez aracılığıyla iletmesini söyleyebilirsiniz. Bunu yapmak için session.use_only_cookies değerini 1 olarak ayarlamanız gerekir. Bu durumda yukarıda gösterilen hile işe yaramayacaktır.
Tarayıcıda çerezler devre dışı bırakıldıysa, yukarıda yaptığımız gibi oturum tanımlayıcısını parametreler aracılığıyla iletebilirsiniz. Üstelik PHP, gerekli parametreyi otomatik olarak bağlantılara ekleyecek ve gizli alanları formlara ekleyecek bir mekanizmaya sahiptir. Çalışma prensibi çerezlerle tamamen aynı olduğundan bu durumu ayrıca analiz etmeyeceğiz.
Oturum verileri sunucuda saklanır. Varsayılan olarak dosyalara yazılırlar, ancak oturum verilerini depolamak için kendi mekanizmanızı belirleyebilirsiniz (örneğin, bir veritabanı kullanarak). Daha fazla ayrıntı istiyorsanız session_set_save_handler işlevine bakın.
Sunucu tarafından benzersiz bir oturum tanımlayıcısı (PHPSESSID) oluşturulur.
Evet, oldukça mümkün. Gördüğünüz gibi PHP doğaüstü hiçbir şey kullanmaz - tanımlayıcı, çerezler kullanılarak istekler arasında kaydedilir, oturum verileri sunucudaki dosyalarda saklanır.
Örneğin, popüler CodeIgniter çerçevesinin oturumlarla çalışmak için kendi mekanizması vardır.
Bir oturum yalnızca benzersiz bir oturum tanımlayıcısıyla tanımlanır, dolayısıyla genel olarak bir saldırganın yalnızca sunucunun kafasını karıştırmak için oturumu çalması yeterlidir. Yukarıda kullandığımız test betiğini ele alalım. Farklı bir IP'den erişiliyorsa (oturumu oluşturan IP'ye göre), ancak aynı PHPSESSID aktarılırsa, oturum başarıyla geri yüklenecek ve sayaç önceki kaydedilen değere göre artacaktır.
Kendiniz ek koruma sağlamanız gerekecektir. Örneğin:
Örneğin, kullanıcının dinamik bir IP'si varsa ve yetkilendirmeyi sürdürmek için oturumlar kullanıyorsanız, ancak aynı zamanda IP eşleşmesini de kontrol ediyorsanız, adres her değiştiğinde kullanıcının kullanıcı adını ve şifreyi yeniden girmesi gerekecektir.
Benzer şekilde, tarayıcı sürümü güncellenirken veya bazı eklentiler yüklenirken Kullanıcı Aracısı dizesi değişebilir.
Not. Resmi web sitesindeki tartışmaya inanıyorsanız, tanımlayıcıyı yeniden oluştururken verilere paralel erişimde sorunlar ortaya çıkabilir.
// Blok 1
oturum_başlangıç();
eğer(isset($_SESSION[ "başlatıldı" ]))
session_regenerate_id();
başka
$_SESSION[ "başlatıldı" ] = doğru;
// blok 2
eğer(isset($_SESSION[ "görüntülemeler" ]))
$_SESSION[ "görüntülemeler" ]++ ;
başka
$_SESSION[ "görüntülemeler" ] = 1;
// blok 3
Eko"
<
body>
Görüntüleme sayısı: ". $_SESSION[ "görüntülemeler"]."