PHP oturumlarının depolandığı yer. PHP SCALPEL altındaki oturumlar
İnternette, ihtiyaç duydukları şey için hangi oturumlardan ve onlarla nasıl çalışacağınız binlerce ders bulabilirsiniz. Ancak, ne yazık ki, onları okuduktan sonra birçok soru kalır. Bence, her şeyde çözmenin en kolay yolu, oturumların içeriden nasıl çalıştığını görmek. Şunlar. Tarayıcı ve Web Sunucusu paylaşım günlüklerini inceleyin, yanı sıra, istemci tarafında ve sunucu tarafında hangi verilerin kaydedileceğini görün.
Bundan sonra, birçok an daha net hale gelir ve mekanizmanın kendisi daha şeffaftır.
Oturumlar aşağıdaki standart komut dosyasında incelenecektir:
Aşağıdaki gibi çalışır:
Blok 1. Session_start () özelliği, benzersiz PhsessID oturum tanımlayıcısını kullanarak, yeni bir oturum oluşturur veya eski'yi yükler.
Blok 2. Oturumu geri yüklemeyi başardıysanız, $ _SESSION ["görünümler"] değeri bir tarafından artar. Değilse, bir tarafından başlatılır.
Teoride, pişirme desteği tarayıcıda etkinse, mekanizma çalışmalı ve sayfa güncellenmelidir, sayacın değeri bir tarafından artar.
İlk yükleme komut dosyası
İstek başlıkları
GET / HTTP / 1.1 Host: firingrange.local Kullanıcı Ajan: 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 \u003d 0.9, * / *; Q \u003d 0.8 Kabul-Dil: RU-TR, RU; Q \u003d 0.8, EN-US; Q \u003d 0.5, EN; Q \u003d 0.3 Kabul Kodlama: GZIP, Kupl-Kükrişi Deflat : Windows-1251, UTF-8; q \u003d 0.7, *; Q \u003d 0.7 Bağlantı: Cephe-Alive önbellek kontrolü: max-age \u003d 0Başlıklar Cevap
Http / 1.1 200 tamam Tarih: Thu, 29 Eyl 2011 20:36:15 GMT Sunucu: Apache / 2.2.13 (Win32) PHP / 5.2.10 X-Powered-by: PHP / 5.2.10 Set-Çerez: PHPSESSID \u003d K33EN6CCGCIA7125MITJ5TE4U6; yol \u003d / Expires: Thu, 19 Kas 1981 08:52:00 GMT Önbellek Kontrolü: Mağaza Yok, Önbellek, Önbellek Olması Gerekenler, Çek Geçici, Çek Sonrası \u003d 0, Ön-Kontrol \u003d 0 PRAGMA: Önbelleksiz içerik uzunluğu: 58 Keep-canlı: zaman aşımı \u003d 5, max \u003d 100 Bağlantı: Kütle-canlı içerik türü: Metin / HTMLYorum Yap
İlk isteğinde, tarayıcı kendisini hiçbir şekilde tanımlamamıştır, böylece mekanizma oturumlar PHP. Yeni benzersiz bir oturum tanımlayıcısı oluşturuldu ve tarayıcıya bu çok tanımlayıcının depolandığı bir demet oluşturmasını sağladı.
Yan sunucu
Sunucu tarafındaki komut dosyasının bir sonucu olarak, aşağıdaki içeriğin SESS_K33EN6CCGCIA7125MITJ5TCGCCIA7125MITJ5TE4U6 oluşturulur:
Müşteri tarafı
Müşteri tarafında, Oturumun benzersiz tanımlayıcısının değerinin depolandığı, aşçı phpsessId oluşturulur.
Not. İçin pHP ayarları Varsayılan olarak, PHPSESSID'nin ömrü ömrü - tarayıcı kapalıyana kadar. Şunlar. Tarayıcı kapalıymaz, Cook silinir ve oturum buna göre kaybolacaktır. Çerez PHPSESSID'nin ömrü, Session.Cookie_Lifetime'in değerini değiştirerek değiştirilebilir.
Komut dosyasının çalışmasının sonucu
İkinci yükleme komut dosyası
İstek başlıkları
Al / http / 1.1 Host: Ateşingrange.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 \u003d 0.9, * / *; Q \u003d 0.8 Kabul etme Dili: RU-TR, RU; Q \u003d 0.8, EN-US; Q \u003d 0.5, EN; Q \u003d 0.3 Kabul etme kodlaması: GZIP, Deflate Kabul - Karakterset: Windows-1251, UTF-8; q \u003d 0.7, *; q \u003d 0.7 Bağlantı: Cephe Canlı Çerez: PHPSESSID \u003d K33EN6CCGCIA7125MITJ5TE4U6 Önbellek kontrolü: max-age \u003d 0Başlıklar Cevap
HTTP / 1.1 200 OK Tarih: THU, 29 Eyl 2011 20:49:41 GMT Sunucusu: Apache / 2.2.13 (Win32) PHP / 5.2.10 X-Powered-by: PHP / 5.2.10 Süresi: Thu, 19 Kasım 1981 08:52:00 GMT Önbellek Kontrolü: Mağaza, NO-CACHE, VERME-Revalidate, Check-Check \u003d 0, Önceden Check \u003d 0 Pragma: Önbellek İçeriği İçerik Uzunluğu: 58 Keep-Canlive: TimeOut \u003d 5, Max \u003d 100 Bağlantı: Cephe Canlı İçerik-Tip: Metin / HTMLYorum Yap
Tarayıcı, PHP'yi kullanarak PHPSESSID Cook Web Sunucusu, SESS_K33EN6CCGCIA7125MITJ5TE4U6 dosyasındaki değerlerle $ _SESSION dizisini başlatır. Buna göre, 2 blokta ise if (düz) şubesi çalışır.
Yan sunucu
Script işlemi sonucunda SESS_K33EN6CCGCIA7125MITJ5TE4U6 dosyasının içeriği değişiyor:
Müşteri tarafı
Müşteri istemcide değişmez.
Komut dosyasının çalışmasının sonucu
Sıradaki ne?
Tarayıcıyı kapatmadan önce sayfanın müteakip indirmeleri, komut dosyasının ikinci yüklenmesinin nasıl çalıştığı ile analoji tarafından çalışacaktır.
Çünkü Cook'un ömrü, tarayıcının mevcut oturumu ile sınırlıydı, daha sonra kapanmasından sonra, benzersiz oturum tanımlayıcısı kaybolacak ve işlemi yeniden başlatırken yenisine devam edecektir.
Ancak, Kayıtlı Oturum'a, PHSESSID'yi komut dosyası parametresi olarak belirtiyorsanız, kaydedilmiş oturumuna geri dönebilirsiniz:
Oturuma geri dönmek oldukça şartlı, çünkü Bu durumda, komut dosyası işleminin bir sonucu olarak, Cook oluşturulmaz. Sunucu Yanıt Başlıkları:
HTTP / 1.1 200 OK Tarih: Thu, 29 Eyl 2011 21:01:52 GMT Sunucusu: Apache / 2.2.13 (Win32) PHP / 5.2.10 X-Powered-by: PHP / 5.2.10 Süresi Dolgu: Thu, 19 Kasım 1981 08:52:00 GMT Önbellek Kontrolü: Mağaza, NO-CACHE, VERME-Revalidate, Check-Check \u003d 0, Önceden Check \u003d 0 Pragma: Önbellek İçeriği İçerik Uzunluğu: 58 Keep-Canlive: TimeOut \u003d 5, Max \u003d 100 Bağlantı: Cephe Canlı İçerik-Tip: Metin / HTML
Şunlar. İşi sürdürmek için, bu oturumdan, atfedilecek tüm bağlantılara? PHPSESSID \u003d K33EN6CCGCIA7125MITJ5TE4U6.
Not. PHP belirleyebilirsiniz, böylece benzersiz oturum tanımlayıcısının sadece aşçıyla iletilir. Bunu yapmak için, seans.use_only_cookies değerinde 1. Bu durumda, yukarıda gösterilen numara geçmeyecektir.
Çerezler tarayıcıda devre dışı bırakılırsa, oturum kimliğini yukarıda yaptığımız gibi parametreler aracılığıyla iletebilirsiniz. Ayrıca, PHP'de istenen parametreyi bağlantıya ekleyecek ve formda gizli alanlar ekleyecek bir mekanizma var. Operasyon prensibi, çerezlerle olduğu gibi tamamen aynıdır, bu nedenle bu durumu ayrı ayrı sökmeyeceğiz.
Küçük Anket (SSS)
Oturum verileri fiziksel olarak nerede saklanır?
Oturum verileri sunucuda saklanır. Varsayılan olarak, dosyalara kaydedilir, ancak kendi oturum veri depolama mekanizmasını belirleyebilirsiniz (örneğin, bir veritabanı kullanarak). Ayrıntılar istiyorsanız, seeness_set_save_handler özelliğine bakın.
Kim benzersiz bir oturum tanımlayıcısı oluşturur?
Benzersiz bir oturum tanımlayıcısı (PHPSESSID) bir sunucu oluşturur.
Kendi oturum mekanizmasını yazmak mümkün mü?
Evet, bu oldukça mümkün. Gördüğünüz gibi, PHP, süpernatural bir şey kullanmaz - tanımlayıcı, aşçı ile olan istekler arasında kaydedilir, oturum verileri sunucudaki dosyalarda saklanır.
Örneğin, oturumlarla birlikte çalışma mekanizması, popüler çerçeve kaposungununda.
Oturumların mekanizması ne kadar güvenlidir?
Oturum, yalnızca benzersiz bir oturum tanımlayıcısının yardımı ile tanımlanır, bu nedenle genel durumda saldırgan sunucuyu karıştırmak için çalmak için yeterlidir. Yukarıda kullandığımız test komut dosyasını alın. Eğer temyiz başvurusu başka bir IP'den (oluşturduğunuz oturuma göre), ancak phsessID aynı şekilde iletilecektir, ardından oturum başarıyla geri yüklenir ve sayaç önceki kaydedilen değerden artacaktır.
Ek koruma sağlamak, sizin için kendiniz olacak. Örneğin:
- IP oturumu ve kullanıcı aracısı istemcisinin verilerinde kaydedebilirsiniz (sunucu tarafında saklanır) ve daha sonra her bir kolun, mevcut değerlerin kaydedilen ile çakıştığını doğrulamak için gereklidir. Bu durumda, kullanıcının güvenliği ve rahatlığı arasında bir uzlaşma aramanız gerekir.
Örneğin, kullanıcının dinamik bir IP'si varsa ve izni sağlamak için oturumu kullanırsanız, ancak aynı zamanda IP'nin navalasyonunu kontrol edin, ardından her adres değişikliğinde, kullanıcı kullanıcı adını ve şifreyi tekrar girmek zorunda kalacaktır.
Benzer şekilde, kullanıcı aracısı dizesi, tarayıcı sürümünü güncellerken veya bazı eklentileri yüklerken değişebilir.
- Önerilen oturumdan korunma mekanizmalarından biri, komut dosyası temyiz edildiğinde her bir tanımlayıcıyı yeniden oluşturmaktır (Bkz. Session_Regenere_id işlevi). Komut dosyasını görüntüleyin ve bölümdeki çalışma algoritması aşağıda olabilir.
Not.Resmi web sitesindeki tartışmaya inanıyorsanız, bir tanımlayıcıyı yeniden oluştururken, verilere paralel erişim ile sorun ortaya çıkabilir.
Bağlamda yeniden üretticinin yeniden üretticisi ile çalışma oturumları
Senaryo
// Blok 1.
session_start ();
eğer.(isset.($ _SESSION ["başlatıldı"]))
session_regenere_id ();
bAŞKA.
$ _SESSION ["başlatıldı"] \u003d doğru.;
// blok 2.
eğer.(isset.($ _SESSION ["görünümler"]))))
$ _SESSION ["görünümler"] ++;
bAŞKA.
$ _SESSION ["görünümler"] \u003d 1;
// blok 3.
eko."
<
body>
Görüş sayısı: ". $ _SESSION [" görünümler "]."