• Borovsky indeksi php kullanıcısı. PHP'de oturumlar. Veritabanı Şeması

    En başından beri PHP büyük bir hızla kabul edildi, ancak bu dilde yeterince büyük projeler oluşturulmaya başlar başlamaz geliştiriciler yeni bir sorunla karşılaştılar - PHP'de küresel değişken kavramı yoktu! 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ışayım: aynı sitenin iki sayfası olduğunu varsayalım: index.php ve dothings.php. Bu sayfaların kaynak kodu şuna benzer:

    index.php dothings.php

    Bu iki scripti çalıştırırsak ilk sayfada "index.php yapmam istendi" 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: Bir kullanıcı sitenin ana sayfasına gelir, bazı eylemler gerçekleştirir ve bu kullanıcıyla ilgili sitenin diğer sayfalarında gerekli olabilecek tüm bilgiler tarayıcısında formda saklanacaktır. bir kurabiye. Bu yöntemin oldukça ciddi dezavantajları vardır, bu nedenle birçok geliştirici aynı anda PHP'ye sırtını dönmüştür. Örneğin, bir kullanıcıya sitenin özel (veya yalnızca kendisine ait olan) 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. Bu yaklaşım, site kullanıcının davranışı hakkında giderek daha fazla bilgi toplamaya başlar başlamaz çok hantal ve kullanışsız hale gelir, çünkü kullanıcıya gönderilen tüm bilgilerin sahte olmayacak şekilde kodlanması arzu edilir. Son zamanlarda, sahte bir çerez birden fazla sohbeti "koyabiliyor" ve hatta bazen başka birinin e-postasına bile girebiliyor. 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'de oturumlarla nasıl düzgün çalışılacağını anlatacağım.

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

    Makaledeki örnekleri (veya komut dosyalarınızı) bazı ticari barındırmalarda test ederseniz, oturumlarla çalışırken herhangi bir sorun yaşanmayacaktır. Sunucunuzu kendiniz kurarsanız (ister gerçek bir sunucu ister emülatör olsun), aşağıdaki gibi 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'yi yanlış yapılandırdığınız anlamına gelir. Oturumları php.ini dosyasına kaydetmek ve sunucuyu yeniden başlatmak için doğru yolu (mevcut dizine) ayarlayarak bu sorunu çözebilirsiniz.

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

    oturum_başlangıç();

    Bu komut sunucuya, bu sayfanın bu 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 şu şekilde çağrılmasının istenebileceği anlamına gelir:

    oturum_başlangıç(); ?> ... 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şkenler ayarlanabilir. $_SESSION dizisinin herhangi bir alanına bir değer atarsanız, 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 bir programı ele alalım:

    index.php Her şey yolunda. Oturum yüklendi! Hadi gidip orada ne olduğunu görelim: dothings.php

    Bu dosyalar sıralı olarak çalıştırıldığında ilk "index.php" betiği aşağıdaki sonucu üretecektir:

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

    Ve ikinci "dothings.php" şudur:

    index.php istendi

    $a değişkeni artık bu sitede oturum başlatan tüm sayfalarda mevcuttur.

    Oturumlarla çalışmaya yönelik diğer yararlı işlevler ve püf noktaları:

    • unset($_SESSION["a"]) - oturum, verilen oturum değişkeninin değerini "unutur";
    • session_destroy () - oturum yok edilir (örneğin, kullanıcı "oturumu kapat" düğmesini tıklayarak sistemden ayrılırsa);
    • session_set_cookie_params (int life [, string path [, string domain]]) - bu işlevi kullanarak, oturumun "ölüm" zamanını belirleyen bir unix_timestamp ayarlayarak oturumun ne kadar süre "yaşayacağını" ayarlayabilirsiniz. Varsayılan olarak bir oturum, istemci tarayıcı penceresini kapatana kadar devam eder.
    • session_write_close () - oturum değişkenlerini yazma ve kapatma. 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 ama kullanışlı birkaç örneğe bakacağız.

    Kullanıcı Yetkilendirmesi

    PHP oturumlarını kullanarak kullanıcı yetkilendirmesi hakkında sorular web programlama konferanslarında sürekli olarak sorulmaktadır. Oturumları kullanarak sistemdeki kullanıcıları 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şmesini sağlayacak, aksi takdirde hata mesajı verecektir.

    Örnekler: index.php Şifreyi girin Giriş:
    Şifre:
    Authorize.php Yanlış şifre girdiniz! secretplace.php Merhaba, gizli bir sayfadasınız!!! :)

    Emniyet

    Böylece, bir tanımlayıcıyı bir sayfadan (PHP betiği) diğerine (sitemizden bir sonraki çağrıya kadar) aktarabiliriz, bu da tüm site ziyaretçilerini ayırt edebileceğimiz anlamına gelir. Oturum tanımlayıcısı çok büyük bir sayı olduğundan (128 bit), onu kaba kuvvetle almanın mümkün olma ş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ı" vardır;
    • Saldırgan, kullanıcının bilgisayarı ile sunucu arasındaki trafiği yakalar. Elbette güvenli (şifreli) bir SSL protokolü var ama bunu herkes kullanmıyor;
    • bir komşu kullanıcımızın bilgisayarına yaklaştı ve oturum numarasını çaldı.

    Birinin birinden bir şey çalması gerçeğine dayanan bu tür durumlar genel olarak bir programcının yetkinliği dahilinde değildir. Yöneticiler ve kullanıcıların kendileri bununla ilgilenmelidir.

    Ancak PHP sıklıkla "aldatılabilir". Kullanıcı yetkilendirme programındaki olası saldırılara 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 aşağıdaki gibi girerek programı kandırmaya yönelik bir girişimdir:
      "http://www.yoursite.ru/secretplace.php?logged_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ı ihtiyaç duymadığı yerden tırmanıyor.

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

    Bir IP adresini vs. engellemek için tonlarca kod yazmayacağız, sadece isteğin nereden geldiğini veya daha doğrusu isteğin hangi sayfadan geldiğini kontrol edeceğiz, eğer sitemizden herhangi bir sayfa ise, o zaman her şey yolunda demektir, ancak diğer tüm durumlarda izin vermeyeceğiz. Authorize.php dosyasını düzeltelim:

    Authorize.php V2 Yanlış şifreyi girdiniz!
    2 numaralı "delikten" nasıl kurtulurum?

    Diyelim ki her ölümlünün bir foruma mesaj göndermek için kaydolabileceği bir web siteniz var. Doğal olarak forumda bazı kullanıcıların (yöneticiler, moderatörler) diğerlerinden daha fazla fırsatı vardır, örneğin diğer kullanıcılardan gelen mesajları silebilirler. Kullanıcının erişim düzeyini oturumda $user_status değişkeninde saklarsınız; burada $user_status = 10, tam sistem erişimine karşılık gelir. Siteye gelen saldırganın düzenli bir şekilde kayıt olması ve ardından tarayıcının adres çubuğuna ?user_status=10 eklemesi yeterlidir. Demek forumda yeni bir yöneticiniz var!

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

    secretplace.php V2 Merhaba, gizli bir sayfadasınız! Sonuçlar

    Oturum mekanizması PHP dilinin oldukça hoş bir özelliğidir. Oturumlar basittir, 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) - oturumlar yalnızca değişkenleri değil aynı zamanda nesneleri de saklayabilir.

    Örnekler ?>
    // SID'lerin bağlantılara otomatik eklenmesi. 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ıç(); // Site yeni ziyaret edildiyse sayacı sıfırlayın. if (!isset($_SESSION["count"])) $_SESSION["count"] = 0; // Oturumda sayacı artır. $_SESSION["count"] = $_SESSION["count"] + 1; ?> Zaman(lar)ın sayısı.
    Sayacı sıfırlamak için tarayıcıyı kapatın.