php oturumlarının depolandığı yer. Neşter altında PHP oturumları
İnternette oturumların ne olduğu, ne için olduğu ve onlarla nasıl çalışılacağı hakkında binlerce öğretici var. Ancak ne yazık ki, onları okuduktan sonra hala birçok soru var. Bence her şeyi anlamanın en kolay yolu, seansların nasıl çalıştığını içeriden görmek. Şunlar. tarayıcının ve web sunucusunun değişim günlüklerini inceleyin ve ayrıca istemci ve sunucu tarafında hangi verilerin depolandığını görün.
Bundan sonra, birçok nokta çok daha anlaşılır hale gelir ve çalışma mekanizmasının kendisi daha şeffaf hale gelir.
Aşağıdaki standart komut dosyasını kullanarak oturumların çalışmalarını inceleyeceğiz:
Şu şekilde çalışır:
Blok 1. session_start () işlevi, benzersiz oturum tanımlayıcısı PHPSESSID'yi kullanarak yeni bir oturum oluşturur veya eski bir oturumu yükler.
2. blok Oturum geri yüklendiyse, $ _SESSION ["görünümler"] değeri artırılır. Değilse, bir olarak başlatılır.
Teorik olarak tarayıcıda çerez desteği açıksa mekanizma çalışmalı ve sayfa her yenilendiğinde sayaç değeri bir artacaktır.
Komut dosyasının ilk yüklemesi
Başlıkları iste
GET / HTTP / 1.1 Ana Bilgisayar: firerange.local Kullanıcı Aracısı: Mozilla / 5.0 (Windows NT 5.1; rv: 6.0.2) Gecko / 20100101 Firefox / 6.0.2 Kabul: metin / html, uygulama / xhtml + xml, uygulama / xml; q = 0.9, * / *; q = 0.8 Kabul-Dil: ru-ru, ru; q = 0.8, en-us; q = 0.5, en; q = 0.3 Kabul-Kodlama: gzip, deflate Kabul-Charset : windows-1251, utf-8; q = 0.7, *; q = 0.7 Bağlantı: canlı tutma Önbellek Kontrolü: maksimum yaş = 0Yanıt başlıkları
HTTP / 1.1 200 TAMAM Tarih: Per, 29 Eylül 2011 20:36:15 GMT Sunucu: Apache / 2.2.13 (Win32) PHP / 5.2.10 X-Powered-By: PHP / 5.2.10 Set-Cookie: PHPSESSID = k33en6ccgcia7125mitj5te4u6; yol = / Bitiş: Per, 19 Kas 1981 08:52:00 GMT Önbellek Kontrolü: depolama yok, önbellek yok, yeniden doğrulama gerekir, kontrol sonrası = 0, ön kontrol = 0 Pragma: önbelleksiz İçerik Uzunluğu: 58 Canlı Tut: zaman aşımı = 5, maks = 100 Bağlantı: Canlı Tutma İçerik Türü: metin / htmlBir yorum
Orijinal istekte, tarayıcı kendisini hiçbir şekilde tanımlamadı, bu nedenle mekanizma PHP oturumları yeni bir benzersiz oturum tanımlayıcısı oluşturdu ve tarayıcıya bu tanımlayıcının saklanacağı bir tanımlama bilgisi oluşturmasını söyledi.
sunucu tarafı
Sunucu tarafında yapılan script sonucunda aşağıdaki içerikle sess_k33en6ccgcia7125mitj5te4u6 dosyası oluşturulur:
İstemci tarafı
İstemci tarafında, benzersiz oturum tanımlayıcısının değerini depolayan bir PHPSESSID tanımlama bilgisi oluşturulur.
Not. saat PHP ayarları varsayılan olarak, PHPSESSID tanımlama bilgisinin ömrü, tarayıcı kapatılana kadardır. Şunlar. tarayıcı kapanır kapanmaz çerez silinecek ve buna göre oturum kaybolacaktır. PHPSESSID tanımlama bilgisi ömrü, session.cookie_lifetime değeri değiştirilerek değiştirilebilir.
Komut dosyasının sonucu
İkinci komut dosyası yükü
Başlıkları iste
GET / HTTP / 1.1 Ana Bilgisayarı: ateşleme aralığı.local Kullanıcı Aracısı: Mozilla / 5.0 (Windows NT 5.1; rv: 6.0.2) Gecko / 20100101 Firefox / 6.0.2 Kabul et: metin / html, uygulama / xhtml + xml, uygulama / xml; q = 0.9, * / *; q = 0.8 Kabul Et-Dil: ru-ru, ru; q = 0,8, en-us; q = 0,5, en; q = 0,3 Kabul-Kodlama: gzip, deflate Kabul Et-Karakter Seti: windows-1251, utf-8; q = 0.7, *; q = 0.7 Bağlantı: canlı tutma Çerez: PHPSESSID = k33en6ccgcia7125mitj5te4u6 Önbellek Kontrolü: maksimum yaş = 0Yanıt başlıkları
HTTP / 1.1 200 Tamam Tarih: Per, 29 Eylül 2011 20:49:41 GMT Sunucu: Apache / 2.2.13 (Win32) PHP / 5.2.10 X-Powered-By: PHP / 5.2.10 Bitiş: Per, 19 Kasım 1981 08:52:00 GMT Önbellek Kontrolü: depolama yok, önbellek yok, yeniden doğrulanmalıdır, kontrol sonrası = 0, ön kontrol = 0 Pragma: önbellek yok İçerik Uzunluğu: 58 Canlı Tut: zaman aşımı = 5, max = 100 Bağlantı: Canlı Tutma İçerik Türü: metin / htmlBir yorum
Tarayıcı, PHPSESSID çerezini, PHP'nin $ _SESSION dizisini sess_k33en6ccgcia7125mitj5te4u6'dan gelen değerlerle başlatmak için kullandığı web sunucusuna gönderir. Buna göre blok 2'de IF dalı (doğrudan) yerine getirilir.
sunucu tarafı
Komut dosyası işlemi sonucunda sess_k33en6ccgcia7125mitj5te4u6 dosyasının içeriği değişir:
İstemci tarafı
İstemci tarafında değişen bir şey yok.
Komut dosyasının sonucu
Sıradaki ne?
Tarayıcıyı kapatmadan önce sonraki sayfa yüklemeleri, ikinci komut dosyası yüklemesinin yaptığına benzer şekilde çalışacaktır.
Çünkü çerezin ömrü mevcut tarayıcı oturumu tarafından sınırlandırılmıştır, daha sonra 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 komut dosyası parametresi olarak açıkça belirterek kaydedilen oturuma dönebilirsiniz:
Oturuma geri dönmek oldukça keyfidir, çünkü betiğin çalışmasının bir sonucu olarak, bu durumda bir çerez oluşturulmaz. Sunucu yanıt başlıkları:
HTTP / 1.1 200 Tamam Tarih: Per, 29 Eylül 2011 21:01:52 GMT Sunucusu: Apache / 2.2.13 (Win32) PHP / 5.2.10 X-Powered-By: PHP / 5.2.10 Bitiş: Per, 19 Kasım 1981 08:52:00 GMT Önbellek Kontrolü: depolama yok, önbellek yok, yeniden doğrulanmalıdır, kontrol sonrası = 0, ön kontrol = 0 Pragma: önbellek yok İçerik Uzunluğu: 58 Canlı Tut: zaman aşımı = 5, max = 100 Bağlantı: Canlı Tutma İçerik Türü: metin / html
Şunlar. bu özel oturumla çalışmayı sürdürmek için tüm bağlantılara PHPSESSID = k33en6ccgcia7125mitj5te4u6 atamanız gerekecek.
Not. PHP'ye yalnızca benzersiz oturum tanımlayıcısını tanımlama bilgisinden geçirmesini söyleyebilirsiniz. Bunu yapmak için session.use_only_cookies'i 1 olarak ayarlayın. Bu durumda, yukarıda gösterilen numara çalışmayacaktır.
Tarayıcıda çerezler devre dışı bırakılırsa, yukarıda yaptığımız gibi oturum tanımlayıcısını parametreler aracılığıyla iletebilirsiniz. Ayrıca PHP, gerekli parametreyi bağlantılara ekleyecek ve formlara gizli alanlar ekleyecek bir mekanizmaya sahiptir. Çalışma prensibi çerezlerle tamamen aynıdır, bu nedenle bu durumu ayrı olarak analiz etmeyeceğiz.
Küçük anket (SSS)
Oturum verileri fiziksel olarak nerede depolanır?
Oturum verileri sunucuda saklanır. Varsayılan olarak dosyalara yazılırlar, ancak oturum verilerini depolamak için kendi mekanizmanızı tanımlayabilirsiniz (örneğin, bir veritabanı kullanarak). Daha fazla ayrıntı için session_set_save_handler işlevine bakın.
Benzersiz oturum kimliğini kim oluşturur?
Benzersiz oturum tanımlayıcısı (PHPSESSID) sunucu tarafından oluşturulur.
Kendi oturum mekanizmamı yazabilir miyim?
Evet, oldukça mümkün. Gördüğünüz gibi, PHP doğaüstü hiçbir şey kullanmaz - tanımlayıcı, tanımlama bilgileri kullanılarak istekler arasında kaydedilir, oturum verileri sunucudaki dosyalarda saklanır.
Örneğin, popüler CodeIgniter çerçevesi, oturumlarla çalışmak için kendi mekanizmasına sahiptir.
Oturum mekanizması ne kadar güvenli?
Bir oturum yalnızca benzersiz bir oturum tanımlayıcısı tarafından tanımlanır, bu nedenle genel olarak bir saldırganın sunucunun kafasını karıştırmak için yalnızca oturumu çalması gerekir. Yukarıda kullandığımız test scriptini ele alalım. Farklı bir IP'den erişilecekse (oturumu oluşturan ile ilgili olarak), ancak PHPSESSID aynı şekilde iletilecekse, oturum başarıyla geri yüklenecek ve sayaç önceki kaydedilen değerden artacaktır.
Sağlamak ek koruma Sen kendin. Örneğin:
- İstemcinin IP ve Kullanıcı-Aracı oturumlarını oturum verilerine kaydedebilir (sunucu tarafında saklanacaktır) ve ardından her aramada mevcut değerlerin kayıtlı değerlerle eşleşip eşleşmediğini kontrol edebilirsiniz. Bu durumda, güvenlik ve kullanıcı deneyimi arasında bir uzlaşma bulmanız gerekir.
Örneğin, bir kullanıcının dinamik IP'si varsa ve yetkilendirmeyi sürdürmek için oturumları kullanıyorsanız, ancak aynı zamanda IP eşleşmesini kontrol ediyorsanız, adres her değiştiğinde, kullanıcının kullanıcı adını ve şifreyi yeniden girmesi gerekecektir.
Benzer şekilde, User-Agent dizesi, tarayıcı sürümünü güncellerken veya bazı eklentileri yüklerken değişebilir.
- Önerilen oturum koruma mekanizmalarından biri, betik her çağrıldığında tanımlayıcıyı yeniden oluşturmaktır (session_regenerate_id işlevine bakın). Çalışmanın senaryosunu ve algoritmasını aşağıdaki bağlamda görebilirsiniz.
Not. Resmi web sitesindeki tartışmaya inanıyorsanız, tanımlayıcı yeniden oluşturulduğunda eşzamanlı veri erişimiyle ilgili sorunlar ortaya çıkabilir.
Bağlamda tanımlayıcının yeniden oluşturulmasıyla oturumların çalışması
Senaryo
// 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üleme"]))
$ _SESSION ["görüntüleme"] ++;
Başka
$ _SESSION ["görüntüleme"] = 1;
// blok 3
Eko"
<
body>
Görüntüleme sayısı: ". $ _SESSION [" görüntüleme "]."