Php'nin varsayılan olarak oturum verilerini kaydettiği yer. PHP'de Oturumlar

10.08.2022

//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:

  1. Süper küresel dizi $_SESSION.
    Oturum başlangıcında oluşturuldu oturum_başlangıç(). Bu yalnızca komut dosyası çalışırken kullanılabilen ve sunucudaki depoda saklanmayan, ancak sunucuda depolanan bir komut dosyası değişkenidir. rasgele erişim belleği(bu, betiğin bir sonraki yürütülmesinden sonra kaybolacağı ve sunucuya bir sonraki erişildiğinde depodan yeniden başlatılacağı anlamına gelir).

    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.

  2. SID'yi pişirin.
    Oturum başlangıcında oluşturuldu oturum_başlangıç(). Belirli bir kullanıcı için oturum veri deposunun konumunu saklar. Yalnızca çerezleri zorla temizlerseniz silinebilir.
  3. Ve sonunda, Oturum veri depolama.
    Bir oturum, session_start() işlevi çağrılarak başlatıldığında oluşturulur. Depolama sunucuda bulunur (PHP betiğinizin çalıştığı yer).
    Dizideki veriler ona yazılır $_SESSION, eğer oradalarsa/görünüyorlarsa. Veriler yalnızca çağrıldığında silinir session_destroy().
    Bu depolama, kullanıcıdan gelen bir sonraki isteğe yanıt alındıktan sonra bile sunucuda var olmaya devam eder; script çalışmasını tamamladı.

Onlar. şunu söyleyebiliriz:

  • Bir PHP betiğinde, $_SESSION dizisi aracılığıyla oturum verileriyle çalışabilirsiniz.
  • $_SESSION oturum deposu için bir "maskedir" ve bu diziye yazmak, depoya yazmakla sonuçlansa da, dizinin silinmesi, depodaki verileri tek başına yok etmez.
  • Diziyi silerek, yalnızca geçerli komut dosyası çağrısında oturum verilerine erişiminizi kaybedersiniz, ancak bir sonrakinde, depolamayı ek olarak temizlemezseniz yeniden başlatılacaktır (küllerinden yükselecektir).

Böylece

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.

Komut dosyasının ilk yüklenmesi

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 et: text/html,application/xhtml+xml,application/ xml;q=0.9,*/*;q=0.8 Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate Accept-Charset : windows-1251,utf-8;q=0.7,*;q=0.7 Bağlantı: canlı tutma Önbellek Kontrolü: max-age=0

Yanıt başlıkları

HTTP/1.1 200 Tamam Tarih: 29 Eylül 2011 Per 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=/ Sona erme tarihi: 19 Kasım 1981 Per 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ı Tutma: zaman aşımı=5, maksimum=100 Bağlantı: Canlı Tutma İçerik Türü: text/html

Bir yorum

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ı

Sunucu tarafında çalışan script sonucunda aşağıdaki içeriğe sahip bir sess_k33en6ccgcia7125mitj5te4u6 dosyası oluşturulur:

İstemci tarafı

İ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.

Senaryonun sonucu

İkinci komut dosyası yükleniyor

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 et: text/html,application/xhtml+xml,application/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-Karakter Kümesi: windows-1251,utf-8;q=0.7,*;q=0.7 Bağlantı: canlı tutma Çerezi: PHPSESSID=k33en6ccgcia7125mitj5te4u6 Önbellek Kontrolü: max-age=0

Yanıt başlıkları

HTTP/1.1 200 Tamam Tarih: 29 Eylül 2011 Per 20:49:41 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, son 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

Bir yorum

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.

Sunucu tarafı

Betiğin çalıştırılması sonucunda sess_k33en6ccgcia7125mitj5te4u6 dosyasının içeriği değişir:

İstemci tarafı

Client tarafında değişen bir şey yok.

Senaryonun sonucu

Sıradaki ne?

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.

Kısa bir anket (SSS)

Oturum verileri fiziksel olarak nerede saklanıyor?

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.

Benzersiz oturum kimliğini kim oluşturur?

Sunucu tarafından benzersiz bir oturum tanımlayıcısı (PHPSESSID) oluşturulur.

Kendi oturum mekanizmanızı yazmanız mümkün mü?

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.

Oturum mekanizması ne kadar güvenli?

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:

  • İstemcinin IP'sini ve Kullanıcı Aracısını oturum verilerine kaydedebilirsiniz (sunucu tarafında saklanacaktır) ve ardından her aramada mevcut değerlerin kaydedilen değerlerle örtüşüp örtüşmediğini kontrol edebilirsiniz. Bu durumda güvenlik ile kullanıcı deneyimi arasında bir uzlaşma yapılması gerekir.

    Ö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.

  • Önerilen oturum koruma mekanizmalarından biri, betiğe her erişildiğinde tanımlayıcıyı yeniden oluşturmaktır (session_regenerate_id işlevine bakın). Çalışmanın senaryosunu ve algoritmasını aşağıda bağlamda görebilirsiniz.

    Not. Resmi web sitesindeki tartışmaya inanıyorsanız, tanımlayıcıyı yeniden oluştururken verilere paralel erişimde sorunlar ortaya çıkabilir.

Bağlamda bir tanımlayıcının tekrar tekrar oluşturulduğu 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ü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"]."



" ;

?>

PHP'deki oturumlar veya bir siteyi ziyaret eden bir kullanıcı veya müşteri hakkındaki veriler, bir sitenin sayfaları arasında geçiş yaparken çok fazla zorluk yaşamadan kaydedilir. Ders çok önemlidir. Web sitelerinin %95'ini oluşturmakla ilgilidir.

Php'de oturum nedir

Oturumlar, aynı sitenin sayfaları arasında gezinirken geçici verileri (örneğin, bir kullanıcının bir siteyi ziyaret ettiğine dair) depolamak için kullanılır. Oturumları kullanırken veriler sunucudaki geçici dosyalarda saklanır.
Çoğu zaman oturumlar (ve bu arada çerezler) çevrimiçi mağazalar, forumlar, mesaj panoları oluştururken kullanılır. sosyal ağlarda, bloglar ve diğer kaynaklar. Oturum sisteminin rahatlığı, verileri saklanan ziyaret eden kullanıcının/müşterinin geçici bilgilerinin saklanmasıdır. hızlı erişim kesin zaman. Oturumun, tarayıcı kapatılana kadar doğal bir son kullanma tarihi vardır. Yalnızca sayfayı kapatırsanız siteyi açtığınızda kullanıcıya/müşteriye ait veriler hala mevcut olacaktır.

Oturum mantığı

Oturum (veya oturum) bir tür geçici veri depolamadır. Az miktarda veri kaydetmenin buna değer olduğu konusunda sizi hemen uyarıyorum. Örneğin, ziyaret eden kullanıcının kullanıcı adı ve şifresi veya veritabanındaki seri numarası.

Çalışma örneği
1. Kullanıcı kullanıcı adı ve şifresini girerek siteye girer
2. Kullanıcı adı ve şifre içeren veriler site sayfalarından birinin oturumuna kaydedilir:

Dosya index.php

Oturum_başlangıcı(); // oturum verilerini kullanmak istediğiniz her dosya, kodun başında "oturum başlat" komutunu içermelidir

$giriş = "yönetici";
$şifre = "şifre";
$_SESSION["giriş"] = $giriş; // oturum açmayı içeren bir değişkeni kaydet
$_SESSION["şifre"] = $şifre; // şifreyi içeren bir değişkeni kaydedin

3. Sitenin başka bir sayfasına gittiğinizde bu veriler de mevcut olacaktır:

Dosya örnek.php(veya başka bir sayfa)

Echo "Giriş bilgileriniz ".$_SESSION["giriş"]; // bu sayfaya herhangi bir veri kaydetmemiş olmamıza rağmen, "Girişiniz yöneticidir" görüntülenecektir!
Bakın, çok basit!

4. Oturum verilerini temizlemek istiyorsanız:

Dosya örnek.php

Oturum_başlangıcı(); // "oturumu yeniden başlat"

Unset($_SESSION["giriş"]); // değişkenin kaydı bu şekilde silindi veya "yok edildi"
echo "Giriş bilgileriniz ".$_SESSION["giriş"]; // "Giriş bilgileriniz" görüntülenecektir. Son satırda yok ettiğimiz için veri yok

Session_destroy(); // oturumu yok et. $_SESSION["password"] dahil hiçbir veri artık mevcut değil. Bunları talep ederken bir hata görüntülenecek
Genel olarak böyle bir aktarım POST yöntemine benzer ancak artık çok fazla gereksiz kod yazmanıza gerek kalmaz ve sayfadan sayfaya aktarılan tüm veriler sunucudaki geçici dosyalarda saklanır. Tekrar ediyorum, oturumlar az miktarda veri içermelidir, bu nedenle kullanıcı adı/şifre, alışveriş sepeti ve diğer küçük hacimlerin saklanması için uygundurlar.

PHP oturumu kullanarak bir değer veya diziyi geçirmek

Bir oturuma yalnızca bir dize değil aynı zamanda bir dizi veri de yazabilirsiniz. Dizinin hacmi konusunda aşırıya kaçmayın çünkü tüm bunlar sunucudaki hızı ve kaplanan alanı etkileyecektir.

Hadi biraz tekrar kullanalım ana sayfa index.php

Oturum_başlangıcı();

$r = array("bir", "iki", "üç");

$_SESSION["dizi"] = $r;

Her şeyin görüntüleneceği sayfaya
Verileri oturuma kaydettik ve tüm verileri görüntüleyeceğimiz başka bir sayfaya giden bağlantıyı takip ettik.

Hedef dosya, sayfa test.php diziyi nerede açıyoruz

Oturum_başlangıcı();
print_r($_SESSION["dizi"]);
// yazdırılacak
/*
Sıralamak
=> bir
=> iki
=> üç
*/
?>
dersini tazelemek isteyebilirsiniz. Genel olarak her şey açık olmalıdır.

Oturumlarla çalışmaya yönelik diğer işlevler

session_unregister(dize)- oturum belirtilen global değişkenin değerini unutur;
session_destroy()- oturumun yok edilmesi (örneğin, kullanıcının çıkış düğmesine tıklayarak sistemden ayrılması durumunda);
session_set_cookie_params(int ömür boyu [, dize yolu [, dize alanı]])- bu işlevi kullanarak, oturumun ölüm zamanını belirleyen bir unix_timestamp ayarlayarak bir oturumun ne kadar süre yaşayacağını ayarlayabilirsiniz.

Php'de oturumlarla çalışmak için işlevlerin listesi
session_cache_expire - geçerli önbelleğin son kullanma tarihini döndürür
session_cache_limiter - Geçerli önbellek sınırlayıcıyı alır ve/veya ayarlar
session_commit, session_write_close() işlevinin takma adıdır
session_decode - bir dizedeki oturum verilerinin kodunu çözer
session_destroy - oturum için kayıtlı tüm verileri yok eder
session_encode - geçerli oturum verilerini bir dize olarak şifreler
session_get_cookie_params - oturum çerezi parametrelerini alır
session_id - geçerli oturum kimliğini alır ve/veya ayarlar
session_is_registered - değişkenin oturumda kayıtlı olup olmadığını belirler
session_module_name - geçerli oturum modülünü alır ve/veya ayarlar
session_name - geçerli oturumun adını alır ve/veya ayarlar
session_regenerate_id - mevcut oturum kimliğini yeni oluşturulan bir oturum kimliğiyle değiştirir
session_register - geçerli oturum için bir veya daha fazla değişkeni kaydeder
session_save_path - mevcut oturumu kaydetmenin yolunu alır ve/veya ayarlar
session_set_cookie_params - oturum çerezi parametrelerini ayarlar
session_set_save_handler - kullanıcı düzeyinde oturum depolama işlevlerini ayarlar
session_start - oturum verilerini başlatır
session_unregister - geçerli oturumdaki bir değişkenin kaydını siler
session_unset - tüm oturum değişkenlerini serbest bırakır
session_write_close - oturum verilerini ve oturumun sonunu yazar

Oturum çalışması örnekleri

Bir oturum sırasındaki sayfa görüntülemelerinin sayacı. Açık bir çalışma örneği. Ancak tarayıcıyı kapattıktan sonra geri sayım yeniden başlayacaktır.

Bir oturumda bir sayfaya yapılan ziyaretlerin sayacı

// Oturumları Çerezler olmadan kullanmanın basit bir örneği.
oturum_adı("test");
oturum_başlangıç();
$_SESSION["count"] = @$_SESSION["count"] + 1;
?>

Tezgah


Bu sayfayı mevcut tarayıcı oturumunuzda açtınız
zamanlar).
Bu sayacı sıfırlamak için tarayıcınızı kapatın.
Sayfayı güncellemek için buraya tıklayın!
Her geçişte sayaç 1 artacaktır)

İlginiz için teşekkür ederiz! Çabalarınızda iyi şanslar!

Bildiğiniz gibi, HTTP protokolü web uygulamalarının istemci ile sunucu arasında bir diyalog olan "oturumlar" oluşturmasına olanak tanır ve bu diyaloğun durumu istekten isteğe korunur.

Öncelikle web programlamaya yönelik bir dil olan PHP dili, HTTP oturum mekanizmasını kullanma yeteneği sağlar ve oturum verilerini düzenlerken ve saklarken endişelerin çoğunu üstlenir. HTTP oturum mekanizmasının çalışması için nelerin gerekli olduğunu hatırlatayım:

  • Sunucu oluşturmalı benzersiz numara oturumlar.
  • Oturum numarasının müşteriye iletilmesi gerekir (genellikle Çerezler aracılığıyla).
  • Sunucu, oturum verilerini dosyalara veya bir veritabanına kaydedebilmelidir, böylece istemcinin sonraki isteklerde (ayrıca Çerezler aracılığıyla) sunucuya gönderdiği oturum numarası bilinerek geri yüklenebilir.

Aslında bir PHP programında oturum mekanizmasının dişlilerinin dönmeye başlaması için yapılması gereken tek eylem tek bir işlevin çağrılmasıdır: session_start(). Bu işlev gerekli tüm şeyleri yapar:

  • İstemcinin Çerezde veya istek parametrelerinde zaten mevcut bir oturum numarası gönderip göndermediğini kontrol eder. İstemci bir oturum numarası gönderdiyse, bu oturuma ait veriler kalıcı bir depolama konumundan (örneğin bir dosya) belleğe yüklenir ve $_SESSION dizisi aracılığıyla program tarafından kullanılabilir hale gelir. İstemci bir oturum numarası göndermediyse veya sunucuda böyle bir oturum mevcut değilse, yeni bir numaraya sahip yeni bir oturum oluşturulur ve bu oturumun verilerine, yeni bir oturum olması durumunda $_SESSION dizisi aracılığıyla da erişilebilir. boş olacak. Yeni oluşturulan oturum numarası Set-Cookie sunucu yanıtının başlık alanına yerleştirilir.
  • Oturum verilerinin depolanmasını sağlar. PHP programı isteği işledikten sonra, $_SESSION dizisinin mevcut durumu, istemcinin bir sonraki isteğinde tekrar kullanılabilir olması için kalıcı bir depolama konumunda saklanır.

Artık session_start() işlevinin ardındaki ayrıntıları bildiğimize göre, bu mekanizmayla oynayabiliriz. Aşağıdaki örnek, oturumda her istemci isteğiyle bir artan tek bir sayıyı saklar:

Bu sayfayı ilk ziyaret ettiğinizde sunucu, tarayıcıya oturum numarasını içeren bir çerez gönderecektir:

Set-Çerez: PHPSESSID=4ftvca7jmmnm04q95r3sdsk6r6; yol=/

Ve tarayıcı, sonraki her istekte aynı oturum numarasını sunucuya geri gönderecektir. Artık tarayıcınızdaki çerezleri temizlerseniz sunucuda farklı numaraya sahip yeni bir oturum oluşturulacak ve test komut dosyamızdaki sayım yeniden başlayacaktır.

Daha gerçekçi örnek: kullanıcı girişi

Çoğu zaman oturumlar, bir kullanıcı bir web sitesinde oturum açtığında kullanılır. Kullanıcı siteye girerken sunucu tarafından doğrulanan kullanıcı adını ve şifreyi girer. Oturum açma bilgileri doğruysa, sunucunun, tekrar oturum açma adı ve parola istememesi için kullanıcının oturumdaki verilerini hatırlaması gerekir. En basit durumda bu bir örnek olacaktır:

array("password" => "123", "title" => "Yönetici",), "user" => array("password" => "qwe", "title" => "Kullanıcı",),) ; isset($users[$login]) döndürülsün mü? $kullanıcılar[$giriş]: null; ) function getCurrentUser() ( $user = isset($_SESSION["user"])? $_SESSION["user"]: null; return $user; ) function setCurrentUser($user) ( $_SESSION["user"] = $kullanıcı ?>

Merhaba,!
Bağlantı1 Bağlantı2

Dışarı çıkmakHenüz siteyi ziyaret etmediniz. Kullanıcı adını ve şifreyi girin:
Giriş yapmak: Şifre:

Bu program kullanıcı adı ve şifre ister ve kullanıcı adınızla giriş yapabilirsiniz. kullanıcı, qwe veya yönetici, 123 . Oturum açan kullanıcıya bir selamlama gösterilir. Oturum açarken kullanıcı adı veya parolanın yanlış olması durumunda bir mesaj görüntülenir.

Bu “siteye” erişmeyi başardıktan sonra, oturum açmış bir kullanıcı olarak kalarak bağlantılara (Bağlantı1, Bağlantı2) tıklayabilirsiniz.

Bir oturumda hangi veriler saklanabilir?

Varsayılan olarak PHP, oturum verilerini geçici bir dosyada metin olarak saklar. Geçici PHP dosyalarının bulunduğu dizine bakarak bunu doğrulayabilirsiniz. Bu dizin Ortam, TEMP bölümündeki phpinfo()'da belirtilmiştir. Bu dizinde sess_ gibi dosyaları bulacaksınız. 4ftvca7jmmnm04q95r3sdsk6r6 4ftvca7jmmnm04q95r3sdsk6r6, Çereze iletilen oturum numarasıdır. Bu dosyaya bir göz atın: Yukarıdaki ilk örneği çalıştırdıysanız, dosya şunun gibi bir şey içerecektir: "value|i:2;". Bu metin, yalnızca bir değişkeni bir sayıyla saklayan oturum içeriğinin serileştirilmiş bir temsilidir.

Bir PHP programının $_SESSION dizisi aracılığıyla bir oturuma koyduğu tüm değerler, oturum kaydedilirken metne dönüştürülür ve daha sonra bir dosyaya yazılır. Değişken değerlerin metne dönüştürülmesi işlemine "serileştirme" denir. Böylece PHP'nin serileştirebildiği her türlü veriyi bir oturuma yerleştirebilirsiniz.

Neyse ki, PHP'de yalnızca sayılar ve dizeler gibi basit değerleri değil, aynı zamanda diziler ve nesneler gibi karmaşık yapıları da serileştirebilirsiniz:

"; print_r($_SESSION); echo ""; $_SESSION["testArray"] = dizi(1, 2, 3, "bir", "iki", "üç", "çocuk" => dizi(5, 6, 7),); $obj = new stdClass(); $obj->x = 1234; $obj->y = 4567; $_SESSION["testObject"] = $obj;

Bu örnek, aşağıdaki verileri oturum dosyasına yazacaktır:

TestArray|a:7:(i:0;i:1;i:1;i:2;i:2;i:3;i:3;s:3:"bir";i:4;s:3 :"iki";i:5;s:5:"üç";s:5:"çocuk";a:3:(i:0;i:5;i:1;i:6;i:2; i:7;))testObject|O:8:"stdClass":2:(s:1:"x";i:1234;s:1:"y";i:4567;)

Bir oturumda nesneleri saklama

Gördüğünüz gibi nesneleri bir oturumda saklayabilirsiniz. Ancak aynı zamanda, bir oturumda bir şekilde “ev yapımı” sınıflarınıza gönderme yapan nesneleri veya sınıflarınızın örnekleri olan nesneleri kaydederken, bu sınıfların bildiriminin session_start( çağrılmadan önce yapılması gerektiğini de unutmamalısınız. ). Yani, PHP, oturum verilerinin seri durumdan çıkarılması sırasında söz konusu sınıfla karşılaşmadan önce sınıfı bilmelidir.

Nesneleri kaydederken, bir nesnenin standart serileştirilmesinin bazı nedenlerden dolayı kabul edilemez veya tamamen imkansız olduğu durumlar vardır. Bu gibi durumlarda, sınıfta __sleep() ve __wakeup() sihirli yöntemlerini bildirerek serileştirmeyi manuel olarak uygulayabilirsiniz.

Bu arada, serileştirme "manuel olarak" da yapılabilir ve oturum verilerinin kaydedilmesi/yüklenmesi gerekli değildir. Uygulamadaki bazı verilerin daha sonra kullanılmak üzere kaydedilmesi veya ağ üzerinden aktarılması gerektiğinde bu gerekli olabilir. Serileştirme/seri durumdan çıkarma için yararlı olabilecek işlevler serileştirme(), serileştirmeyi kaldırma(), json_encode(), json_decode()'dur.

Bir oturumda neler saklanamaz?

Bir oturum serileştirilemeyen hiçbir şeyi depolayamaz. Böyle bir varlığa örnek olarak herhangi bir PHP kaynağı verilebilir. Kaynaklar ağ bağlantıları, açık dosya tanıtıcıları, veritabanı bağlantıları ve diğer bazı nesnelerdir. PHP'deki bir kaynak, PHP'nin bağırsaklarında bulunan ve programdan doğrudan erişilemeyen ancak çeşitli PHP işlevleri çağrılarak değiştirilebilen dahili bir nesneye yapılan referanstır. İçeriği serileştirilemeyen ve serileştirilmemesi gereken bir tür “kara kutu”.

Ek özellikler

PHP, geliştiriciye, örneğin bir veritabanında oturum verilerini depolamak için kendi yöntemini uygulama fırsatı verir. Bunu yapmak için oturum verilerini kalıcı bir depolama konumundan kaydedecek ve yükleyecek işlevlerin uygulanması gerekir. Daha sonra işlevi çağırarak PHP'ye bu işlevler hakkında bilgi vermeniz gerekir. session_set_save_handler.

Yüksek yüklü sitelerde oturum verilerinin kaydedilmesi ve yüklenmesi sürecini hızlandırmak için verileri bellekte saklayan Memcached sunucusu kullanılabilir. Bu oturum depolama yöntemi desteği PHP'de yerleşiktir ve php.ini yapılandırma dosyası aracılığıyla yapılandırılır.

Oturum numarasının iletildiği Cookie parametresinin adını, adını, ömrünü, etki alanını ve diğer parametreleri belirterek ayarlayabilirsiniz.

PHP'de HTTP oturumlarını ayarlamak için bunlar ve diğer birçok seçenek, session_* işlevleri aracılığıyla kullanılabilir.

En başından beri herkes PHP'yi büyük bir hızla kabul etti, ancak bu dilde oldukça büyük projeler oluşturulmaya başlar başlamaz geliştiriciler yeni bir sorunla karşı karşıya kaldılar - PHP global değişken kavramından yoksundu! Yani, belirli bir komut dosyası yürütüldü, oluşturulan sayfa istemciye gönderildi ve bu komut dosyası tarafından kullanılan tüm kaynaklar yok edildi. Örneklemeye çalışacağım: diyelim ki bir sitenin iki sayfası var; index.php ve dothings.php. Bu sayfaların kaynakları şöyle görünür:

index.php şeyler.php

Bu iki scripti çalıştırırsak ilk sayfada “index.php'ye atandım” yazısını göreceğiz ve ikinci sayfa boş olacaktır.

Web sitesi geliştiricileri, hiç düşünmeden, global değişkenleri istemci tarafında depolamak için çerezleri kullanmaya başladı. Süreç şuna benziyordu: Kullanıcı sitenin ana sayfasına gelir, bazı işlemler yapar ve bu kullanıcıyla ilişkili, sitenin diğer sayfalarında ihtiyaç duyulabilecek tüm bilgiler tarayıcısında formda saklanacaktır. Çerezlerden. Bu yöntemin oldukça ciddi dezavantajları var, çünkü birçok geliştirici bir anda PHP'den uzaklaştı. Örneğin, bir kullanıcıya sitenin özel (veya özel) bölümlerine erişmesine izin vermesi için yetki vermemiz gerekir. Kullanıcıya, sitedeki sonraki tanımlayıcısı olarak görev yapacak bir çerez göndermeniz gerekecektir. Site kullanıcının davranışı hakkında daha fazla bilgi toplamaya başlar başlamaz bu yaklaşım çok hantal ve kullanışsız hale gelir, çünkü kullanıcıya gönderilen tüm bilgilerin sahte olmayacak şekilde kodlanması tavsiye edilir. Yakın zamanda sahte çerezler kullanarak birden fazla sohbeti "kırmak" ve hatta bazen başka birinin e-postasına gizlice girmek mümkün oldu. Ayrıca dünyada hala tarayıcısı çerezleri desteklemeyen garip insanlar var.

Oturum mekanizmasının teknolojik sorunlarına girmeyeceğim, yalnızca PHP'deki oturumlarla doğru şekilde nasıl çalışılacağını anlatacağım.

Oturumlarla nasıl çalışılır?

Makaledeki örnekleri (veya komut dosyalarınızı) herhangi bir ticari barındırmada test ederseniz, oturumlarla çalışırken herhangi bir sorun yaşanmayacaktır. Sunucunuzu kendiniz kurarsanız (ister gerçek bir sunucu ister bir emülatör olsun), buna benzer hatalar görünebilir:

"Uyarı: open(/var/state/php/sess_6f71d1dbb52fa88481e752af7f384db0, O_RDWR) başarısız oldu: Böyle bir dosya veya dizin yok (2)."

Bu sadece PHP'nizin yanlış yapılandırıldığı anlamına gelir. Oturumları php.ini dosyasına kaydetmek ve sunucuyu yeniden başlatmak için doğru yolu (mevcut bir dizine) belirterek bu sorunu çözebilirsiniz.

Oturumlardaki değişkenleri (verileri) kullanacak herhangi bir komut dosyası aşağıdaki satırı içermelidir:

Oturum_başlangıcı();

Bu komut, sunucuya belirli bir sayfanın belirli bir kullanıcıyla (tarayıcıyla) ilişkili tüm değişkenlere ihtiyacı olduğunu bildirir. Sunucu bu değişkenleri dosyadan alır ve kullanılabilir hale getirir. Kullanıcıya herhangi bir veri gönderilmeden önce oturumun açılması çok önemlidir; pratikte bu, session_start() işlevinin sayfanın en başında çağrılmasının tavsiye edilebileceği anlamına gelir; örneğin şu şekilde:

Oturum_başlangıcı(); ?> ... Oturum dosyalarının kaydedileceği dizini ayarlamak için session_save_path() işlevini kullanın: session_save_path($_SERVER["DOCUMENT_ROOT"]."/session"); oturum_başlangıç();

Oturum başladıktan sonra genel değişkenleri ayarlayabilirsiniz. $_SESSION dizisinin herhangi bir alanına herhangi bir değer atarken, aynı ada sahip bir değişken otomatik olarak oturum değişkeni olarak kaydedilir. Bu dizi, oturumu kullanan tüm sayfalarda mevcuttur. Örnek olarak programa bakalım:

index.php Her şey yolunda. Oturum yüklendi! Hadi geçelim ve orada ne olduğunu görelim:

şeyler.php

Bu dosyaları sırayla çalıştırdığınızda, ilk "index.php" betiği aşağıdaki sonucu üretecektir:

Her şey yolunda. Oturum yüklendi! Hadi geçelim ve orada ne olduğunu görelim:

Ve ikinci “dothings.php” şudur:

index.php yazmam istendi

$a değişkeni artık belirli bir sitenin oturum başlatan tüm sayfalarında kullanılabilir.

Oturumlarla çalışmaya yönelik diğer yararlı özellikler ve teknikler:

  • unset($_SESSION["a"])- oturum, belirtilen oturum değişkeninin değerini "unutur";
  • session_destroy()- oturumun yok edilmesi (örneğin, kullanıcının "çıkış" düğmesine tıklayarak sistemden ayrılması durumunda);
  • session_set_cookie_params (int ömür boyu [, dize yolu [, dize alanı]])- bu işlevi kullanarak, oturumun "ölüm" zamanını belirleyen unix_timestamp ayarını yaparak oturumun ne kadar süre "yaşayacağını" ayarlayabilirsiniz. Varsayılan olarak oturum, istemci tarayıcı penceresini kapatana kadar "canlı" olur.
  • session_write_close()- oturum değişkenlerinin kaydedilmesi ve kapatılması. Sayfanın işlenmesi uzun sürüyorsa ve tarayıcınızın oturum dosyasını engellemişse siteyi yeni bir pencerede açmak için bu gereklidir.

Örnekler

Şimdi oturum mekanizmasının pratik uygulamasına dönelim. Burada oldukça basit ve aynı zamanda yararlı birkaç örneğe bakacağız.

Kullanıcı Yetkilendirmesi

PHP oturumlarını kullanarak kullanıcı yetkilendirmesine ilişkin sorular web programlama konferanslarında sürekli olarak sorulmaktadır. Sistemdeki kullanıcıları oturumları kullanarak yetkilendirme mekanizması, güvenlik açısından oldukça iyidir (bkz. bölüm).

Örneğimiz üç dosyadan oluşacaktır: index.php,authorize.php ve secretplace.php. index.php dosyasında kullanıcının kullanıcı adını ve şifresini gireceği bir form bulunur. Bu form, yetkilendirme başarılı olursa kullanıcının secretplace.php dosyasına erişmesine izin verecek, aksi takdirde bir hata mesajı görüntüleyecek olan Authorize.php dosyasına veri iletecektir.

Örnekler: index.php Şifrenizi girin

Giriş yapmak:
Şifre:


yetkilendirme.php sayfa... başlık("Konum: secretplace.php"); çıkış; ) ) // bir şeyler yanlışsa kullanıcı // bir hata mesajı alacaktır. ?> Yanlış şifre girdiniz!

secretplace.php Merhaba,, gizli bir sayfadasınız!!! :)

Emniyet

Böylece, bir sayfadan (PHP betiği) diğerine (sitemizden bir sonraki çağrıya kadar) bir tanımlayıcı aktarabiliyoruz, bu da tüm site ziyaretçilerini birbirinden ayırabildiğimiz anlamına geliyor. Oturum tanımlayıcısı çok büyük bir sayı olduğundan (128 bit), kaba kuvvetle bulunma şansı neredeyse yoktur. Bu nedenle saldırganın elinde aşağıdaki seçenekler kalır:

  • kullanıcının bilgisayarında oturum numaralarını çalan bir Truva atı var;
  • Saldırgan, kullanıcının bilgisayarı ile sunucu arasındaki trafiği keser. Tabii ki korumalı (şifreli) SSL protokolü, ancak herkes bunu kullanmaz;
  • bir komşu kullanıcımızın bilgisayarına yaklaştı ve oturum numarasını çaldı.

Birinin başka birinden bir şey çalmasına dayanan bu tür durumlar genel olarak programcının yetki alanı dahilinde değildir. Yöneticiler ve kullanıcıların kendileri bununla ilgilenmelidir.

Ancak PHP sıklıkla "kandırılabilir". Kullanıcı yetkilendirme programındaki olası hack noktalarına bakalım:

  • Authorize.php dosyası, üçüncü taraf bir komut dosyası kullanarak bir parolayı tahmin etme girişimidir;
  • Secretplace.php dosyası, tarayıcının adres çubuğuna $logged_user değişkeninin değerlerini girerek programı aldatma girişimidir, örneğin:
    "http://www.yoursite.ru/secretplace.php? log_user=hacker"

Yani, programımızda iki "delik" açıkça görülüyor, biri küçük ve pek fark edilmiyor, ancak ikincisi çok büyük ve çoğu bilgisayar korsanı gitmesine gerek olmayan yere giriyor.

1 numaralı deliğe nasıl yama yapılır?

Bir IP adresini vb. engellemek için tonlarca kod yazmayacağız, ancak yalnızca isteğin nereden geldiğini veya daha doğrusu isteğin hangi sayfadan geldiğini kontrol edin, eğer sitemizden herhangi bir sayfaysa, o zaman her şey yolunda, ancak diğer tüm durumlarda içeri girmenize izin vermeyeceğiz. Authorize.php dosyasını ayarlayalım:

yetkilendirme.php V2 sayfa... başlık("Konum: secretplace.php"); çıkış; )) ) ) ?> Yanlış şifre girdiniz!


2 numaralı "delikten" nasıl kurtulurum?

Herkesin bir foruma mesaj göndermek için kaydolabileceği bir web siteniz olduğunu varsayalım. Doğal olarak forumda bazı kullanıcıların (yöneticiler, moderatörler) diğerlerinden daha fazla olanağı vardır; örneğin diğer kullanıcıların mesajlarını silebilir. Kullanıcının erişim düzeyini oturumda $user_status değişkeninde saklarsınız; burada $user_status = 10, sisteme tam erişime karşılık gelir. Siteye gelen saldırganın normal şekilde kayıt olması ve ardından tarayıcının adres çubuğuna ekleme yapması yeterlidir. ?user_status=10. Demek forumunuzda yeni bir yöneticiniz var!

Prensip olarak, herhangi bir komut dosyası değişkeni, komut dosyasına tam adresin ardından basitçe bir soru işareti ve değişkenin adı ve değeri eklenerek adres çubuğu aracılığıyla ayarlanabilir. Bunu önlemek için kodumuzu düzeltelim:

secretplace.php V2 değişken unset($_SESSION["logged_user"]); // oturumu açın session_start(); /* öylece bu sayfaya gidemezsiniz... eğer kullanıcı adı kayıtlı değilse, kullanıcı adı ve şifreyi girmesi için onu index.php sayfasına yönlendiririz... burada aslında birçok şey yapabilirsiniz, örneğin, kullanıcının IP'sini hatırlayın ve dosyalara üçüncü erişim denemesinden sonra onu engelleyin. */ if(!isset($_SESSION["logged_user"]))( başlık("Konum: index.php"); çıkış; ) ?> Merhaba,, gizli bir sayfadasınız!

Sonuçlar

Oturum mekanizması PHP dilinin oldukça iyi bir özelliğidir. Oturumlar basit ve kullanımı oldukça esnektir. Bu arada, PHP oturumlarının çok az belgelenmiş bir özelliği var (4.0.3 sürümünden itibaren mevcut) - oturumlarda yalnızca değişkenleri değil aynı zamanda nesneleri de saklayabilirsiniz.

Örnekler

?>
// SID'yi bağlantılara otomatik olarak ekleyin. ini_set("session.use_trans_sid", true); oturum_başlangıç(); ?> Buraya tıklayın!
Buraya tıklayın!!



// Oturumlarla çalışmaya bir örnek. oturum_başlangıç(); // Siteyi yeni ziyaret ettiyseniz sayacı sıfırlayın. if (!isset($_SESSION["count"])) $_SESSION["count"] = 0; //Oturumdaki sayacı arttırıyoruz. $_SESSION["count"] = $_SESSION["count"] + 1; ?>

Tezgah

zamanlar).
Sayacı sıfırlamak için tarayıcınızı kapatın.
" target="_blank"> Bir alt tarayıcı penceresi açın.
// Oturumları Çerezler olmadan kullanmanın basit bir örneği. oturum_adı("test"); oturum_başlangıç(); $_SESSION["count"] = @$_SESSION["count"] + 1; ?>

Tezgah

Bu sayfayı mevcut tarayıcı oturumunuzda açtınızzamanlar).
Bu sayacı sıfırlamak için tarayıcınızı kapatın.
?">Sayfayı yenilemek için burayı tıklayın!