int setcookie (dize adı [, dize değeri [, int süre sonu [, dize yolu [, dize alanı [, int güvenli]]]]])

Setcookie(), geri kalan başlık bilgileriyle birlikte gönderilecek çerezi belirtir. önce diğer başlıklar (bu bir çerez sınırlamasıdır, PHP değil). Bu, bu işleve çağrıları veya etiketlerinden önce yapmanızı gerektirir. Ad dışındaki tüm bağımsız değişkenler isteğe bağlıdır. Yalnızca bir ad bağımsız değişkeni sağlanırsa, bu ada sahip çerez uzak istemciden silinecektir. Ayrıca, bu bağımsız değişkeni atlamak için herhangi bir bağımsız değişkeni boş dize ("") ile değiştirebilirsiniz. güvenli argümanlar tamsayılar/tamsayılardır ve boş bir satır kullanılarak atlanamazlar. Bunlarda sıfır (0) kullanın. Sona erme argümanı, time() veya mktime() tarafından döndürülen normal bir Unix zaman tamsayısıdır. Güvenli argüman, bu çerezin yalnızca güvenli bir HTTPS bağlantısı üzerinden gönderilmesi gerektiğini belirtir. Çerezler ayarlandıktan sonra, $_COOKIE dizisi (4.1.0'dan önceki PHP sürümlerinde $HTTP_COOKIE_VARS olarak adlandırılır) aracılığıyla bir sonraki sayfa yüklenirken bunlara erişilebilir. Yaygın tuzaklar: Çerezler bir sonraki sayfa yüklenene kadar görünmez.Çerezler, ayarlandıkları ayarlarla silinmelidir. PHP 3'te, aynı kodda setcookie() işlevine birden fazla çağrı ters sırada yapılabilir. Bir çerezi silmeden önce başka bir çerezi silmeye çalışıyorsanız, ekleme işlemini silmeden önce yapmanız gerekir. PHP 4'te setcookie() işlevine birden fazla çağrı, çağrıldıkları sırayla yürütülür. Aşağıda çerez gönderme örnekleri verilmiştir:
Çerezin değer kısmının, çerez gönderildiğinde otomatik olarak urlencode edileceğini ve alındığında otomatik olarak kodunun çözüleceğini ve çerez adıyla aynı ada sahip bir değişkene atanacağını unutmayın. Test çerezimizin içeriğini bir komut dosyasında görüntülemek için aşağıdaki örneklerden birini kullanmanız yeterlidir: Çerezler hakkında daha fazla bilgi için şu adresteki Netscape spesifikasyonuna bakın: http://www.netscape.com/newsref/std/cookie_spec.html. Service Pack 1 içeren Microsoft Internet Explorer 4, yol parametresi ayarlanmış tanımlama bilgileri ile düzgün çalışmaz. Netscape Communicator 4.05 ve Microsoft Internet Explorer 3.x, yol ve saat ayarlanmamışsa tanımlama bilgilerini doğru şekilde işlemez.

Son güncelleme: 11/1/2015

Çerezler, bir web sitesinin kullanıcının bilgisayarında her türlü bilgiyi saklayabildiği küçük veri kümeleridir (en fazla 4 kByte). Çerezleri kullanarak sitedeki kullanıcı etkinliğini takip edebilirsiniz: kullanıcının sitede oturum açıp açmadığı, ziyaret geçmişini vb. takip edebilirsiniz.

Çerezleri kaydetme

Çerezleri kullanıcının bilgisayarına kaydetmek için işlevi kullanın çerez ayarla(). Aşağıdaki tanımı vardır:

Bool setcookie(string $ad, string $değer, int $sona erme, string $yol, string $etki alanı, bool $güvenli, bool $httponly);

setcookie() işlevi aşağıdaki parametreleri kabul edebilir:

    name: değerine erişmek için kullanılacak çerezin adı

    değer: çerezin değeri veya içeriği - 4 kByte'tan büyük olmayan herhangi bir alfasayısal metin

    sona erme (isteğe bağlı): Çerezlerin imha edildiği son kullanma tarihi. Bu parametre ayarlanmamışsa veya 0'a eşitse, tarayıcı kapatıldıktan sonra çerez imha edilir.

    yol (isteğe bağlı): çerezlerin mevcut olacağı sunucudaki dizinin yolu. "/" belirtirseniz site genelinde çerezler bulunacaktır. Örneğin "/mydir/" ayarını yaparsanız çerezlere yalnızca dizinden erişilebilir /dirim/" ve tüm alt dizinleri. Varsayılan değer, çerezlerin yüklendiği geçerli dizindir.

    etki alanı (isteğe bağlı): Çerezlerin mevcut olacağı etki alanını belirtir. Örneğin ikinci düzey bir alan adıysa, localhost.com, çerezler, aşağıdaki gibi alt alan adları da dahil olmak üzere localhost.com sitesinin tamamı için kullanılabilir. blog.localhost.com.

    Bir alt alan adı belirtilirse blog.localhost.com, çerezler yalnızca söz konusu alt alanda kullanılabilir.

    güvenli (isteğe bağlı): Çerez değerinin HTTPS üzerinden gönderilmesi gerektiğini belirtir. true olarak ayarlanırsa, istemciden gelen bir çerez yalnızca güvenli bir bağlantı kurulduğunda sunucuya gönderilir. Varsayılan olarak false olur.

    yalnızca http (isteğe bağlı): doğruysa, çerezlere yalnızca http protokolü aracılığıyla erişilebilir. Yani, bu durumda çerezler, JavaScript gibi komut dosyası dillerinde kullanılamayacaktır. Varsayılan olarak parametre false'tur

Çerezleri kaydedelim:

$değer1 = "Singapur"; $değer2 = "Çince"; setcookie("şehir", $değer1); setcookie("dil", $değer2, zaman()+3600); // geçerlilik süresi 1 saat

Burada iki çerez ayarlanmıştır: "şehir" ve "dil". İlk çerez tarayıcı kapatıldıktan sonra, ikincisi ise 3600 saniye sonra, yani bir saat sonra yok edilir.

Çerezleri alma

Bir çerez almak için global bir ilişkisel dizi kullanabilirsiniz. $_COOKIEörneğin, $_COOKIE["şehir"] . Böylece önceden kaydedilmiş çerezleri alıyoruz:

If (isset($_COOKIE["şehir"]) echo "Şehir: " . $_COOKIE["şehir"] . "
"; if (isset($_COOKIE["dil"])) echo "Dil: " . $_COOKIE["dil"];

Dizileri Çerezlerde Saklamak

Dizileri çerezlere kaydetmenin bazı özel özellikleri vardır. Örneğin aşağıdaki diziyi kaydedelim:

Setcookie("lan", "PHP"); setcookie("lan", "C#"); setcookie("lan", "Java");

Şimdi onu alıyoruz ve sayfada gösteriyoruz:

If (isset($_COOKIE["lan"])) ( foreach ($_COOKIE["lan"] as $name => $value) ( ​​$name = htmlspecialchars($name); $value = htmlspecialchars($value) ); echo "$isim. $değer
"; } }

Çerezleri kaldırma

Bir çerezi silmek için son kullanma tarihi olarak geçmişteki bir zamanı belirtmeniz yeterlidir:

Setcookie("şehir", "", zaman() - 3600);

Web programlamanın temel prensiplerini tanımaya devam ediyoruz. Bugün sözde hakkında konuşacağız kurabiye(kurabiye). Çerez, web sunucusu tarafından istemciye gönderilen ve istemci tarafında saklanan verilerdir.

Herhangi bir web betiği, örneğin bir PHP betiği, genellikle birkaç saniyede çalışır ve bilgileri daha fazla gönderilmek üzere web sunucusuna döndürür. Betik tamamlandıktan sonra, çalışması sırasında RAM'de oluşturulan tüm veriler yok edilir. Bazen bu veriler kaybolamaz. Diyelim ki sitenin ana sayfasında tercih ettiğiniz arka plan rengini seçmenizi isteyen bir HTML formu var. Daha sonra tüm sayfalar kullanıcının seçtiği rengi kullanır. Renk değeri, bir çerez kullanılarak belirli bir görev bağlamında saklanabilen bir şeydir.

PHP'deki çerez mekanizmasının işleyişini daha iyi anlamak için, özellikle sözde "ilk çıktı" kavramına değinen "PHP Yorumlayıcısı. Temeller, çalışma ilkeleri" makalesini okumalısınız. Böylece, bir isteğe HTTP yanıtı oluşturma aşamasında mekanizmayı kullanabilirsiniz. Web istemcisine bazı parametreleri kaydetmesi talimatını vermek için HTTP yanıtına bir başlık eklenir formun bir değeri ile ad=değer(parametre adı, parametre değeri), örneğin:

Set-Cookie: ismim=john

Birden fazla parametrenin saklanması gerekiyorsa bu tür birkaç başlık olabilir. Bir HTTP yanıtı alırken, web tarayıcısı Set-Cookie başlıklarının varlığını kontrol eder ve varsa değerlerini dahili hizmet dosyalarında saklar. Çerezler varsayılan olarak site etki alanına bağlıdır. Bir HTTP isteği hazırlarken web tarayıcısı, isteğin yapıldığı alanla ilişkili çerezlerin depolanıp depolanmadığını kontrol eder. Varsa HTTP isteğine bir başlık eklenir

Çerez: ad=değer

Bulunan her kayıtlı parametre için. Böylece, bir web istemcisine belirli parametreleri çerez olarak kaydetmesi talimatını veren bir web sunucusu, bu parametreleri o istemciden gelen sonraki tüm HTTP isteklerinde geri alacaktır. Tarayıcınızı kapattığınızda kayıtlı çerezler silinir.

Çerez içerisinde çerezin ömrünü belirtebilirsiniz. Bu amaçla özel bir özellik eklenir süresi doluyor Aşağıdaki şekilde:

Set-Cookie: isim=değer; süresi doluyor=tarih

Tarih, tarayıcının bu çerezi silmesi gereken tarih ve saati gösterir; örneğin:

Sona erme özelliğinin biçimine dikkat edin.

Özellik kullanılıyor yolÇerezlerin kapsamını sınırlayabilirsiniz. Varsayılan olarak çerezler, belirli bir alan adına ait tüm isteklere uygulanır; bu, değere karşılık gelir. yol=/. Örneğin, ayarlarsak yol=/doc/, bu durumda çerezler yalnızca /doc/ dizinine ve onun tüm alt dizinlerine ve belgelerine (örneğin /doc/images/) yapılan istekler için geçerli olacaktır. Yol özelliğine sahip örnek:

Ayrıca bu özelliği kullanarak etki alanı bağlamayı geçersiz kılabilirsiniz. ihtisas. Varsayılan olarak bir çerez, isteği çerezin oluşturulmasını başlatan belgenin etki alanına bağlıdır. Eğer belirtirseniz .domain.ru, çerez, domain.ru alan adına ve tüm alt alan adlarına yapılan isteklere uygulanacaktır. Eylemi belirli bir alt alan adıyla, örneğin www.domain.ru ile sınırlandırabilirsiniz. Süre sonu, yol ve etki alanı niteliklerinin kullanıldığı örnek:

PHP'de çerezlerle nasıl çalışılacağını anlamanın zamanı geldi. Çerezleri ayarlamak için bir PHP işlevi setcookie vardır:

Bool ( string $isim [ , string $değer [ , int $süresi = 0 [ , string $yol [ , string $etki alanı [ , bool $güvenli = false [ , bool $httponly = false ] ] ] ] ] )

Çoğu işlev parametresi isteğe bağlıdır. Gerçek bir örneğe bakalım (önceden önerilen, arka plan rengi seçeneği olan sayfa):

"#090" , "mavi" => "#009" , "kırmızı" => // Varsayılan arka plan rengi (beyaz). İlgili çerez mevcutsa renk çerezden alınacaktır (daha sonra uygulanacaktır) ?>
">
İstenilen arka plan:

Bu örnekte çerez mekanizması henüz aktif hale getirilmemiştir, sadece sayfa çerçevesi oluşturulmuştur. Önceki makaleleri ve dersleri okuduysanız bu kodu anlayabilmeniz gerekir. Dizi olası renklerin bir listesini saklar (kendi renginizi ekleyebilirsiniz), renkler HTML biçiminde açılır liste olarak görüntülenir. Şimdi formdan bir veri işleyici yazmanız gerekiyor. Geleneksel olarak, verileri bildirdikten sonra onu en üste yerleştiririz:

"#090" , "mavi" => "#009" , "kırmızı" => "#900" ) ; $bgrenk = "#fff" ; // Varsayılan arka plan rengi (beyaz). İlgili çerez mevcutsa renk çerezden alınacaktır (aşağıdaki örnekte uygulanmıştır) //--Arka plan rengi değerini bir çereze kaydedin. Detaylar yazının altında } ?>

İşleyici, kullanıcının seçtiği rengin değerini alır ve setcookie PHP işlevini kullanarak bunu bir çerezde saklar. setcookie işlevi, oluşturulan HTTP yanıtına çerezimizden bir Set-Cookie başlığı ekleyecektir. Başlık işlevi gibi, yalnızca çıktıdan önce, yani kodun mümkün olduğu kadar yukarısında kullanılabilir.

Harika, çerezleri kaydettik. Artık bunları kullanmamız gerekiyor. İşleyicinin üstüne, eğer orada saklanıyorsa, çerezden arka plan rengi değerini almak için gereken kodu ekleyin:

if ( isset ([ "bgcolor" ] ) && in_array ([ "bgcolor" ] , $renkler ) ) ( $bgcolor = [ "bgcolor" ] ; )

Her şey çok basit. Komut dosyası isteğiyle birlikte herhangi bir çerez gönderilmişse, PHP bunları global $_COOKIE dizisine yerleştirir. Dolayısıyla kabul edilen çerezlerle çalışmak, örneğin kabul edilen GET veya POST parametreleriyle çalışmaktan farklı değildir. Tam komut dosyası listesi:

"#090" , "mavi" => "#009" , "kırmızı" => "#900" ) ; $bgrenk = "#fff" ; // Varsayılan arka plan rengi (beyaz) //--bgcolor'un çerezlerde kayıtlı olup olmadığını kontrol edin (çerezlerin değiştirilmesi kolay olduğundan doğruluğunu da kontrol ederiz) if ( isset ([ "bgcolor" ] ) && in_array ([ "bgcolor" ] , $renkler ) ) ( //--Varsa kaydedilen değeri kullanın$bgrenk = [ "bgrenk" ] ; ) //--GET parametresi bgcolor'un aktarılıp aktarılmadığını ve dizimizde olup olmadığını kontrol edin. Aksi takdirde, bilirsin, sana kim bilir ne verebilirler ve sonra bunu halletmemiz gerekecek;) if ( isset ($_GET [ "bgcolor" ] ) && in_array ($_GET [ "bgcolor" ] , $renkler ) ) ( $bgcolor = $_GET [ "bgcolor" ] ; //--Bu sayfa için yeni arka planımız olacak("bgrenk", $bgrenk) ; ) ?> Sayfa arka planını seçebilme özelliği
">
İstenilen arka plan:

Senaryonun nasıl çalıştığına bir göz atın; herhangi bir sorunuz varsa yorum yapmaktan çekinmeyin. Arka plan rengi sözde kaydedilir. geçici çerez tarayıcıyı kapattığınızda silinecek. Kalıcı bir çerez kullanalım.Bunu yapmak için, setcookie işlevinde üçüncü bir parametre tanımlamamız gerekir - Set-Cookie HTTP başlığının sona erme özelliğine dönüştürülecek olan çerez silme süresi. Parametre Unix biçiminde bir zaman damgasını belirtir. Çoğu zaman, böyle bir işaret oluşturmak için, geçerli saati Unix formatında döndüren ve buna çerezin silinmesi gereken saniye sayısını ekleyen PHP time() işlevi kullanılır. Örneğin, zaman()+3600- Çerezleri bir saat sonra silin. Çerezimizi bir hafta boyunca aktif hale getirelim:

("bgcolor" , $bgcolor , zaman () + 3600 * 24 * 7 ) ; //--Arka plan rengi değerini bir çereze kaydedin

İşte bu, artık site, tarayıcıyı kapattıktan sonra bile seçilen arka plan rengini "hatırlıyor". Bu arada, çerezleri silmek için sona erme tarihi olarak geçmiş tarihi belirtmeniz yeterli; örneğin zaman()-3600. Örnekleri test ederken HTTP başlıklarına bakmayı unutmayın.

Güvenlik her web sitesinin başarısının önemli bir parçasıdır. Ancak güvenliğin yanlış şekilde iyileştirilmesi maliyetlerin artmasına ve genel kullanıcı rahatsızlığına yol açabilir. Bu kılavuzda oturum dosyaları ve çerezlerle çalışırken karşılaşılan yaygın sorunlara bakacağız.

Kurabiye

Çerezler, bir kullanıcıyı bir site aracılığıyla tanımlamanın yollarıdır. Örneğin site, adı: "favorite_color" ve değeri: "red" olan bir çerez oluşturur. Artık siteyi her ziyaret ettiğinizde bir çerez indirilecek ve favori renginiz kırmızı olacak şekilde ayarlanacaktır (“favorite_color”, “kırmızı”). Kullanıcının siteyi her ziyaret ettiğinde sisteme kayıt olması gerekmediği için bu oldukça kullanışlıdır. Birçok sitede bulunan “Beni Hatırla” seçeneğinde de bu yöntem kullanılıyor. Ancak bu yöntem aynı zamanda sitenin güvenlik sisteminde de ciddi açıklar oluşturabilir.

Bir örnek, sitenize hangi çerezin döndürüleceğini doğrulamaz. Basit bir aramanın ardından kullanıcı paneli komut dosyası içeren bir web sitesi buldum. Bu komut dosyası, tüm giriş bilgilerimi çerezlere aktardı ve eylem her yürütüldüğünde değerleri yükledi. Örneğin, bir yorum bırakırsam sistem, çerez adları değişkeninden benim adlarımdan herhangi birini döndürecektir. Daha sonra, firebug uzantısını ve birkaç başka cihazı kullanarak bu dosyaları yalnızca görüntüleyemedim, aynı zamanda düzenleyebildim. Bu nedenle adımı içeren bir çerezi düzenlediğimde site adın doğruluğunu onaylamadı ancak verileri görüntüledi. Kimliğimi de değiştirebilirim. Sonunda yönetici kimliğini (001) bulmayı ve yönetici erişimi elde etmeyi başardım.

Oturumlar

Oturumlar, sunucunuzda saklanan kullanıcı tanımlama değişkenleridir. Çerezlerden farklı olarak kullanıcılar bunları doğrudan değiştiremez ancak aynı zamanda risk hala mevcuttur. Oturumlara yönelik iki ana tehdit vardır: oturumun sabitlenmesi ve oturumun ele geçirilmesi.

Bir oturumu kaydetme

Oturum sabitleme, kullanıcılar önceden kurulmuş bir oturuma bağlanıp bilgilerini buraya yüklediğinde meydana gelir. Saldırgan, önceden oluşturulmuş bir oturuma giriş yaparak bu oturumu ziyaret edebilir ve kullanıcılar tarafından girilen bilgileri elde edebilir. Basit bir örnek, önceden ayarlanmış bir oturum kimliğine sahip bir web sitesine giden bağlantıyı takip etmektir. Örneğin, http://www.example.com/?PHPSESSID=1234. Saldırgan artık bilgilerinizi görüntülemek için aynı PHPSESSID'yi kullanıyor.

Oturum çalma

Oturum ele geçirme, savunması çok daha zor olan ikinci saldırı türüdür. Bu durumda saldırgan, paket (veri) analizi ve diğer çeşitli yöntemlerle oturum tanımlayıcınızı ele geçirebilir. Örneğin ağınıza bağlanan bir saldırgan, yönlendiricinize gönderilen tüm verilerinizi filtreleyebilir. Bir saldırgan, oturum kimliğinizi aldıktan sonra bu kimliği ziyaret ederek tüm bilgilerinize erişebilir.

Seansların etkili kullanımı

Bu kılavuz, kayıt komut dosyasının kodlanması sürecini kapsamamaktadır. Ancak mevcut giriş komut dosyanızı nasıl daha güvenli hale getireceğinizi göstermeye çalışacağım.

Genel olarak oturumları kullanmak, çerezleri kullanmaktan daha güvenlidir. Bunun nedeni kullanıcıların çerez değerlerini değiştirebildikleri kadar oturum değerlerini de kolayca değiştirememeleridir. Bu nedenle tüm kullanıcı değişkenlerini oturum değişkenlerinde saklamayı seviyorum. Bir diğer önemli nokta ise kullanıcı girişine asla güvenmemektir. Kullanıcı bilgilerini daima MYSQL veritabanındaki değerlerle karşılaştırın ve ardından buna göre oturuma çıktı verin. Kayıt işlevinde aşağıdaki gibi değişiklikler yapmayı düşünün:

işlev girişi($kullanıcı adı, $şifre)
$sql = mysql_query("Kimliği SEÇİN, kullanıcı_seviyesi FROM kullanıcılardan WHERE şifresi = "" . $şifre . "" VE kullanıcı adı = "" . $kullanıcıadı . "" SINIR 1");
// Eşleşme yoksa kullanıcı adı ve şifre eşleşmiyor demektir
if($sql === yanlış)
{
yanlış döndür;
}
başka
{
while($u = mysql_fetch_array($sql))
{
session_regenerate_id(true);
$session_id = $u;
$session_username = $kullanıcıadı;
$session_level = $u;

$_SESSION["user_id"] = $session_id;
$_SESSION["user_level"] = $session_level;
$_SESSION["kullanıcı_adı"] = $oturum_kullanıcıadı;
$_SESSION["user_lastactive"] = zaman();
doğruyu döndür;
}
}

Bu kodu analiz edelim. Kullanıcı adı ve şifre sorar ve bu kriterlerin her ikisine de uyan bir kullanıcı olup olmadığını kontrol eder. Sonuç alınamazsa geçersiz bir kullanıcı adı/şifre kombinasyonu oluşturulur ve hata oluşturulur. Aksi takdirde oturum değişkenleri oluşturulur: user_id, user_level, user_name ve user_lastactive. Bu değerler mysql listesindeki verilerle doldurulur.

“session_regenerate_id(true)” fonksiyonunun ne anlama geldiğini merak ediyor olabilirsiniz. Daha önce oturum sabitleme hakkında konuşmuştuk. Bu çözüm, bu tür saldırılara karşı koruma sağlamak için tasarlanmıştır. İşlev, kullanıcı her oturum açtığında yeni bir oturum kimliği oluşturur. Bu sayede kullanıcı oturum değeri ayarlanmış bir bağlantıya tıkladığında yeni bir oturum kimliği oluşturulacak ve kullanıcı bilgileri eski oturum yerine yeni oturuma eklenecektir. Bu fonksiyon üzerinden doğru parametre (true) iletildiğinde eski oturumu siler ve tüm bilgileri siler.

“Beni Hatırla” fonksiyonunun yazılması

Çerezler veya oturum dosyaları kullanıcı şifreleri içermemelidir. Bu çok önemlidir çünkü bir oturum dosyası veya çerez ele geçirilirse saldırgan tüm hesapların tam kontrolünü ele geçirebilir. Birçok kullanıcının aynı şifreyi farklı hesaplarda kullandığı biliniyor ve bu durum, bir saldırganın diğer sitelerdeki kullanıcı hesaplarının kontrolünü ele geçirmesine olanak tanıyacak. Bu çıkmazdan nasıl kurtulabiliriz?

Bu sorunun çözümü erişim yetkilendirme anahtarıdır (auth_key). Erişim yetkilendirme anahtarı, bir kullanıcı adı, şifre ve bir araya getirilip şifrelenen rastgele bir karakter kümesinin birleşimi olabilir. Her kullanıcının kendine özel erişim yetkilendirme anahtarı olmalıdır. Böylece bir çerez ayarlandığında değer erişim yetkilendirme anahtarına ayarlanır. Bundan sonra erişim yetkilendirme anahtarının değeri, eklediğiniz MySQL listesindeki değerle karşılaştırılır. Bakalım kullanıcı giriş özelliği nasıl değişecek.

account_active = doğru; // Kullanıcının, hesabın çereze kaydedilmesini isteyip istemediğini kontrol edin if($remember) ( // Her oturum açma için yeni kimlik doğrulama anahtarı oluşturun (bu nedenle, çerezlerin ele geçirilmesi durumunda // eski kimlik doğrulama anahtarı birden çok kez kullanılamaz) $cookie_auth= Rand_string(10) . $kullanıcıadı; $auth_key = session_encrypt($cookie_auth); $auth_query = mysql_query("UPDATE user SET auth_key = "" . $auth_key . "" WHERE kullanıcı adı = "" . $kullanıcı adı . """); setcookie("auth_key", $auth_key, time() + 60 * 60 * 24 * 7, "/", "example.com", false, true)) ) // Oturuma değişkenler atayın session_regenerate_id(true); $session_id = $u; $session_username = $kullanıcıadı; $session_level = $u; $_SESSION["user_id"] = $session_id; $_SESSION["user_level"] = $session_level; $_SESSION["kullanıcı_adı"] = $oturum_kullanıcıadı; $_SESSION["user_lastactive"] = zaman(); doğruyu döndür; )) ) ) ?>

Artık “true” parametresinin, oturum açma fonksiyonunun hatırlama parametresinden geçip geçmediğini kontrol eder. Evetse, erişim yetkilendirme anahtarı için bir çerez ayarlanır. Rand_string işlevi, içinden geçen karakter sayısını içeren bir dize oluşturur. Session_encrypt işlevi zincire rastgele veriler ekler ve md5 kullanarak tüm bilgileri şifreler. Bu zincir benzersizdir çünkü her kullanıcı için benzersiz bir kullanıcı adı kullanır. MySQL listesindeki erişim yetkilendirme anahtarı daha sonra çereze girilen değere ayarlanır. Ancak bu koruma siteniz için yeterli olmayabilir. Birden çok erişim yetkilendirme anahtarı ve birden çok çerez eklemeyi düşünün. Yine bu fonksiyon “beni hatırla” fonksiyonunun gereklerini karşılamıyor. Ayrıca bir başlatma işlevi eklemeniz gerekir.

Bu fonksiyona her sayfada erişilmesi gerekir. Amacı, çerezin erişim yetkilendirme anahtarını (“auth_key”) kontrol etmektir. Çerez isset fonksiyonunu kullanıyorsa ilgili kullanıcı görünecektir. Bir kez daha bu fonksiyona her sayfada erişilmesi gerekmektedir.

Bu kod isset fonksiyonunun kullanılıp kullanılmadığını kontrol eder. Bu fonksiyonun bir çerez tarafından kullanılması durumunda erişim yetkilendirme anahtarının kullanıcı ile eşleştirilmesi için kontrol yapılacaktır. Bir eşleşme yapılırsa dosya gerekli bilgileri çıkaracak ve kullanıcıyı kaydedecektir. Aksi takdirde çerez geçersiz olduğundan silinecektir.

Diğer fonksiyonlar

= $currenttime)( // Yeni kullanıcının son aktif olduğu zamanı ayarlayın $_SESSION["user_lastactive"] = $currenttime; ) else ( // Eğer oturum çok uzun süre aktif değilse logout(); ) ) ) ) ?>

Oturum kapatma özelliği açıklayıcıdır. Bu fonksiyon tüm oturum değişkenlerini ve çerezleri siler ve kullanıcının erişim yetkilendirme anahtarını 0 olarak ayarlar. Bundan sonra erişim yetkilendirme anahtarı artık kullanılamaz. Bir kullanıcının çerezini 0'a ayarlayabileceğini ve yine de kendi kullanıcı adı altında oturum açabileceğini unutmayın. Bunu düzeltmek için çerezlerden alınan tüm bilgileri kontrol edin. Regexp işlevini kullanarak dizenin geçerli sayıda karakter içerdiğinden, geçerli karakterler içerdiğinden vb. emin olun. Keepalive() işlevi oturumu canlı tutar. Bu işlev her sayfada olmalıdır.

Sonuç ve oturumun ele geçirilmesi

Oturum Hijacking'e karşı korunmak son derece zordur. Kimlik etiketleri oluşturmak için kullanıcının IP adresinin veya Kullanıcı Aracısı işleminin bir kombinasyonunun kullanılmasıyla ilgili bazı tavsiyeleri okumuş olabilirsiniz. Ancak bu, gerçek kullanıcılarınız için etkili değildir. Kullanıcı IP adresleri sürekli değişmektedir. AOL gibi büyük İnternet servis sağlayıcıları bunları birkaç dakikada bir değiştirir. Bu çok büyük bir sorun yaratacaktır. Kullanıcı Aracısı işlemleri de değişir - IE7, kullanıcı aracılarının periyodik olarak değiştiğini tespit etmiştir. Müdahaleye karşı korunmanın en iyi yolu bir asa sistemi oluşturmaktır. Bu sistem her yükleme sayfasında bir çerez çıktısı alır ve ayrıca bu değeri mysql listenizde saklar. Çerez değeri daha sonra MySQL tablo değeriyle karşılaştırılır. Farklı olmaları durumunda oturum geçersiz olacaktır.

Bunlar oturum dosyaları ve çerezlerle çalışmaya yönelik temel işlevlerdir. Elbette güvenliği artırmak için verilerin geçerliliğini doğrulamak amacıyla daha fazla çerez eklemek gerekir. Bu koruma düzeyi hassas bilgileri korumak için yeterli değildir ancak bir yerden başlamanız gerekir! Ve sonuç olarak:

Lütfen çerez değerlerinin geçerli olduğundan emin olun.
Asla bir oturum şifresi veya çerez değişkeni çıktısı almayın.

Oturum sabitlemesini önlemek için bir tanımlayıcı kullanın
session_regenerate_id.

Bir sonraki derslere kadar!

Not: Koddaki yorumları 24 saat içinde çevireceğim :)

Bugünkü dersimizde PHP'de çerezlerle çalışmaktan bahsedeceğiz. Ne olduğu, neden gerekli olduğu ve neden ilk etapta ortaya çıktığı ile başlayalım.

Çerezler ne için kullanılır?

Sizin ve benim zaten bildiğimiz gibi, PHP'de GET ve POST istekleriyle çalışabiliriz. Kodun çalışmasını bir şekilde etkilemek için sunucuya veri aktarmamıza izin veriyorlar. Kullanıcı adını ve şifreyi betiğe iletebiliriz, bunları kontrol edecek ve herhangi bir bilgiye erişmemize izin verecektir. Ancak bu, sunucuyla aramızda bir oturum oluşturulmasına izin vermeyecektir. Yani sunucu bizi "hatırlayamaz" ve biz olduğumuzu her söylemek istediğimizde, kullanıcı adı ve şifreyle ayrı bir yeni istek göndermemiz gerekecek.

Çerezler bir çözüm olarak icat edildi. Bunlar, PHP'deki bir dizi gibi anahtar/değer tipindeki kayıtlardır, ancak site kullanıcısının tarayıcısında saklanırlar. Çerezler her site için ayrı ayrı saklanır. Bir kullanıcı bir siteye her istekte bulunduğunda, tarayıcı bu kayıtların o site için mevcut olup olmadığını kontrol eder. Ve eğer varsa, bunları bu siteye yapılan her isteğin başlığında gönderir.

Çerezler nereden geliyor?

Çerezler, sunucunun "isteği" üzerine tarayıcıda oluşturulur. Bir noktada ziyaretçinin tarayıcısında değeri olan bir çerez oluşturmamız gerektiğine karar veririz. Bunu yapmak için, sunucunun istemciye yanıt olarak, bu site için tarayıcıda hangi kaydın oluşturulması gerektiğini belirten özel bir başlık göndermesi gerekir.

Bütün bunlar arka planda gerçekleşir ve kullanıcı tarafından fark edilmez. Herhangi bir web sitesindeki yetkilendirme bu prensibe göre çalışır. En basit durumda, siteye kullanıcı adınızı ve şifrenizi girdikten sonra sunucu bunların doğru olup olmadığını kontrol eder. Ve eğer öyleyse, sunucu tarayıcıdan bu verileri bir çerezde saklamasını ve her istekte ona göndermesini isteyebilir.

Yani sunucu kabaca şunu söylüyor: “Hey tarayıcı, benim için “login” anahtarı ve “admin” değeriyle ve “şifre” anahtarı ve “123” değeriyle bir giriş oluştur. Bundan sonra tarayıcı aşağıdaki gibi ek veriler göndermeye başlar:

Giriş: yönetici şifresi: 123

Bundan sonra sitenin yetkilendirme gerektiren diğer yerlerinde artık kullanıcıyı tekrar form doldurmaya zorlamadan bu verileri çerezden kontrol etmek mümkün olacak. Ve eğer bunlar doğru kullanıcı adı ve şifreyse, kullanıcıya bir şeye erişim izni verin.

Yaşam süresi hakkında

Aynı zamanda çerezin bir TTL'si (Time To Live) bulunmaktadır. Yani bu kayıtlar geçici olabilir. Bu ömür, çerez tarayıcıya yüklendiğinde sunucu tarafından da belirtilir. Bu sayede seansın yarım saat sürmesini sağlayabilirsiniz. Ve bu sürenin sonunda kullanıcının tekrar giriş yapması gerekecektir. Muhtemelen bunu birçok sitede çalışırken fark etmişsinizdir.

PHP'de çerezlerle nasıl çalışılır

Yani çerezlerin nasıl çalıştığına dair temel bir anlayışa sahibiz. Şimdi PHP'de bunlarla nasıl çalışabileceğinizi görelim.

Projemizde viewCookies.php adında bir dosya oluşturalım. İçine aşağıdaki kodu yerleştirelim.

Şu ana kadar tahmin etmeniz gerektiği gibi, $_COOKIE PHP'deki dizilere benzer başka bir global dizidir $_GET Ve $_POST. Geçerli isteğin bir parçası olarak tarayıcı tarafından gönderilen tüm çerezleri yalnızca o saklar.

Sayfayı tarayıcıda açarak bu betiğin nasıl çalıştığına bakalım: http://myproject.loc/viewCookies.php

Gördüğümüz gibi bu dizi şu anda boş. Hadi dolduralım :) Bunu yapmak için tarayıcıya bir çeşit çerez yüklememiz gerekiyor. PHP'de fonksiyon bunun için kullanılır setcookie($isim, $değer, $ttl, $yol)

Geçilen parametreler:

  • $name – çerez adı
  • $value – değeri
  • $ttl – ömür boyu. 0 belirtirseniz, çerez kalıcı olarak (silininceye kadar) kurulacaktır.
  • $path – adres çubuğundaki yol. "/" belirtirseniz sitedeki tüm dizinlerden çerezler bulunacaktır. Örneğin, hem http://myproject.loc/ hem de http://myproject.loc/posts/ adresinde. "/posts/" seçeneğini belirlerseniz, çerezlere yalnızca http://myproject.loc/posts/ dizininden ve onun tüm alt dizinlerinden (örneğin, http://myproject.loc/posts/new/) erişilebilir. Varsayılan değer, çerezin yüklendiği geçerli dizindir. Eğer çerezin site genelinde kullanılabilir olmasını istiyorsak bu değeri "/" olarak ayarlamamız gerekmektedir.

Birkaç parametre daha var, bunlar hakkında resmi belgelerde okuyabilirsiniz.

Şimdi bu işlevi çalışırken deneyelim. setCookies.php adında bir dosya oluşturalım ve içine aşağıdaki kodu yazalım:

Bundan sonra http://myproject.loc/setCookies.php adresine gidin, burada boş bir sayfa göreceğiz. Daha önce de söylediğimiz gibi çerezlerle çalışmak kullanıcı tarafından görülmez.

Ancak bu çalışma her zaman Google Chrome geliştirici konsolunda görülebilir. Hadi açalım (F12 tuşuna basarak), Ağ sekmesine gidelim, tarayıcıda sayfayı yenileyelim ve onu indirilen veriler listesinde bulalım (orada tek olan budur).

Bu girişe tıklayın ve sağda açılan pencerede Başlıklar sekmesini seçin. Burada Response Headers kısmında belirttiğimiz verilerin yer aldığı Set-Cookie başlığını görebiliriz.

Böylece çerezler tarayıcıya başarıyla yüklendi. Şimdi $_COOKIE dizisini görüntüleyen sayfamıza gidelim - http://myproject.loc/viewCookies.php

Görüldüğü gibi daha önce tarayıcıya yüklenen çerezler artık sunucuya gönderilmektedir. Bunları ayrıca geliştirici konsolundaki İstek Başlıkları bölümüne bakarak istekte de görebilirsiniz.

Belirli bir site için tarayıcıda bulunan tüm çerezleri görmeniz gerekiyorsa bunları aynı Google Chrome geliştirici konsolunda görüntüleyebilirsiniz. Bunu yapmak için Uygulama sekmesine gidin, soldaki listeden Çerezler öğesini ve içindeki sitemizi seçin.

Tüm çerezler uygun bir listede sunulacaktır.

Çerezler hakkında bilmeniz gereken başka şeyler

Bu dersi bitirmek için, çerezlerin HTTP aracılığıyla sunucu yanıtında bir başlık kullanılarak ayarlandığını eklememiz gerekiyor. HTTP protokolü, başlığın her zaman veriden önce gelmesi ve başka hiçbir şeyden önce gelmemesi gerektiği şekilde tasarlanmıştır. Bu nedenle, setcookie işlevi ve PHP'deki HTTP yanıtındaki başlığı değiştiren diğer işlevler, herhangi bir çıktı verilmeden önce çağrılmalıdır.

Önce çerezi ayarlayabilir ve ardından metni görüntüleyebilirsiniz.

Her şey harika sonuçlanacak.

Ancak metni (HTTP yanıtının gövdesi olan) yazdırıp ardından çerezi ayarlamayı deneyemezsiniz.

Gördüğümüz gibi bu bir hataya yol açacaktır. HTTP protokolü bu şekilde çalışır. Önce başlık, sonra gövde. Sadece bu şekilde ve başka şekilde değil.

Birden fazla çerez ayarlama

Birkaç çerez ayarlamaktan daha kolay bir şey yok. Bunu yapmak için setcookie fonksiyonunu birkaç kez çağırmanız yeterlidir.

Müşteriye başarıyla aktarılacaklar.

Bir sonraki derste çerezler aracılığıyla tam kullanıcı etkileşiminin bir örneğine bakacağız. Bu arada ödevimizi yapalım.