setcookie

(PHP 4, PHP 5, PHP 7)

setcookieBir çerez gönderir

Açıklama

setcookie ( string $isim [, string $değer = "" [, int $zaman_aşımı = 0 [, string $yol = "" [, string $alan = "" [, bool $güvenli = false [, bool $sadece_http = false ]]]]]] ) : bool

setcookie() işlevi, HTTP başlıklarının kalanıyla gönderilmek üzere bir çerez tanımlar. Diğer başlıklar gibi, çerezlerde betiğinizin herhangi bir çıktısından önce gönderilmelidir (bu bir protokol kısıtlamasıdır). Bu kısıtlama, bu işleve yapılacak çağrıların, <html> ve <head> etiketleri ve hatta her türlü boşluk karakteri çıktısından bile önce yer almasını gerektirir.

Çerezler bir kere atandı mı, artık $_COOKIE dizisi ile sonraki sayfa yüklemesinde erişilebilir olacaktır. Çerez değerleri ayrıca, $_REQUEST içinde de mevcut olabilir.

Değiştirgeler

setcookie() değiştirgelerinin her birinin nasıl çalıştığını hakkında bilgi edinmek için » RFC 6265'e bakınız.

isim

Çerezin ismi.

değer

Çerezin değeri. Bu değer istemcinin bilgisayarında saklanır. Bu bakımdan çerezlerde güvenlik ihlaline konu bilgiler saklamayın. isim değiştirgesinde 'çerezim' ismini kullandığınız varsayımıyla, bu çerezin değerini $_COOKIE['çerezim'] değişkeni ile alabilirsiniz.

zaman_aşımı

Çerezin zaman aşımına uğrama süresi. Değer bir Unix zaman damgasıdır. Başka bir deyişle time() işlevinden dönen değere çerezin zaman aşımına uğrayacağı süreyi saniye cinsinden eklemek suretiyle bulacağınız değerdir. Ayrıca, mktime() işlevini de kullanabilirsiniz. time()+60*60*24*30 ile çerez 30 gün sonra zaman aşımına uğrar. Burada 0 atanır veya birşey belirtilmezse, çerez oturumun sonunda (tarayıcı kapandığında) zaman aşımına uğrar.

Bilginize:

zaman_aşımı değiştirgesinin değer olarak bir Unix zaman damgası aldığını fark etmişsinizdir. Bu, başlıkta belirtilen Wdy, DD-Mon-YYYY HH:MM:SS GMT tarih biçeminin zıddı olup bu dönüşümü PHP dahili olarak yapar.

yol

Çerezin üzerinde etkin olacağı sunucudaki yol. '/' belirtilirse çerez alan'ın tamamında kullanılabilir olacaktır. Eğer '/foo/' belirtilirse, çerez sadece /foo/ dizininde ve /foo/bar/ gibi alt dizinlerde kullanılabilir olacaktır. Öntanımlı değer çerezin atandığı içinde bulunulan dizindir.

alan

Çerezin kullanılabileceği (alt)alan. Çerezi ('www.example.com' gibi) bir alt alan adında kullanılabilir yapmak onu tüm diğer alt alan adlarında da (w2.www.example.com gibi) kullanılabilir kılacaktır.için değer olarak '.mesela.dom' belirtmelisiniz. Çerezi tüm alt alan adlarında kullanılabilir yapmak için buraya alan adını (örneğimiz için ('example.com') yazın.

Eski tarayıcılar hala kullanımdan kalkmış olan ve alt alan adıyla eşleşme sağlamak için . ile başlatmayı gerektiren » RFC 2109'u gerçeklemektedir.

güvenli

Çerezin istemciye güvenli bir HTTPS bağlantısı üzerinden mi aktarılması gerektiğini belirtmek için kullanılır. TRUE belirtildiği takdirde, çerez sadece güvenli bağlantı mevcutsa gönderilecektir. Sunucu tarafında, bu çeşit çerezin sadece ($_SERVER["HTTPS"] ile ilgili) güvenli bağlantı üzerinden gönderilmesi kararı programcıya aittir.

sadece_http

TRUE olduğu takdirde çerez sadece HTTP protokolü üzerinden erişilebilir olacaktır. Yani çerez, JavaScript gibi betik dilleri tarafından erişilebilir olmayacaktır. Bu ayarlama, XSS saldırılarıyla kimlik hırsızlığı riskini etkin şekilde azaltmaya (tüm tarayıcılar tarafından desteklenmese de) yardımcı olabilir, fakat bu sava çoğunlukla itiraz edilir. Bu değiştirge PHP 5.2.0'da eklenmiştir. Değer olarak TRUE veya FALSE belirtilebilir.

Dönen Değerler

Bu işlev çağrılmadan önce yapılmış çıktı varsa setcookie() başarısız olup FALSE döndürür. setcookie() başarılı olduğu takdirde TRUE döndürür. Dönüş değeri, kullanıcının çerezi kabul ettiği ya da etmediği anlamına gelmez.

Örnekler

Çerez gönderimi ile ilgili bazı örnekler:

Örnek 1 - setcookie() gönderim örneği

<?php
$value 
'bir şeyler bir yerlere';

setcookie("TestCookie"$value);
setcookie("TestCookie"$valuetime()+3600);  /* 1 saatliğine geçerli */
setcookie("TestCookie"$valuetime()+3600"/~rasmus/""example.com"1);
?>

Çerez gönderilirken çerez değerinin özdevinimli olarak URL kodlamasından geçirileceğine, alınırken ise bu kodlamanın yine özdevinimli olarak çözüleceğine ve yine aynı çerez ismine atanacağına dikkat ediniz. Bunu istemiyorsanız, PHP 5 kullanıyorsanız bu işlevin yerine setrawcookie() işlevini kullanabilirsiniz. Deneme çerezimizin bir betik içindeki değerini görmek için aşağıdaki örneklerden birini kullanabilirsiniz:

<?php
// Bağımsız bir çerez bas
echo $_COOKIE["TestCookie"];

// Tüm çerezleri görmek için başka bir yol
print_r($_COOKIE);
?>

Örnek 2 - setcookie() silme örneği

Bir çerezi silerken, tarayıcınızın yürürlükten kaldırma mekanizmasını tetikleyebilmek için, süre bitiminin geçmişte kalmasını sağlamanız gerekir. Önceki örnekte gönderilen çerezin nasıl silineceğini görelim:

<?php
// süre bitimini 1 saat önceye ayarlayalım
setcookie ("TestCookie"""time() - 3600);
setcookie ("TestCookie"""time() - 3600"/~rasmus/""example.com"1);
?>

Örnek 3 - setcookie() ve diziler

Çerez ismini belirtirken dizi gösterimini kullanmak suretiyle çerez dizileri tanımlayabilirsiniz. Bu sayede dizi elemanı sayısı kadar çerez tanımlayabilirsiniz, fakat çerezleri betiğinizle aldığınızda değerlerin hepsi çerez isminde bir diziye yerleştirilirler:

<?php
// çerezleri tanımlayalım
setcookie("cookie[three]""cookiethree");
setcookie("cookie[two]""cookietwo");
setcookie("cookie[one]""cookieone");

// sayfayı yeniden yükledikten sonra çerezler basalım
if (isset($_COOKIE['cookie'])) {
    foreach (
$_COOKIE['cookie'] as $name => $value) {
        
$name htmlspecialchars($name);
        
$value htmlspecialchars($value);
        echo 
"$name : $value <br />\n";
    }
}
?>

Yukarıdaki örneğin çıktısı:

three : cookiethree
two : cookietwo
one : cookieone

Sürüm Bilgisi

Sürüm: Açıklama
5.5.0 Max-Age niteliği istemciye gönderilen Set-Cookie başlığında artık bulunmaktadır.
5.2.0 sadece_http değiştirgesi eklendi.

Notlar

Bilginize:

PHP 4'ten itibaren, bu işlevi çağırmadan önce, tarayıcıya gönderilene kadar sunucuda bekletilmek üzere çıktıyı bir tampona yazabilirsiniz. Bu işlemi betiğinizden ob_start() ve ob_end_flush() işlevlerini çağırarak veya output_buffering yapılandırma yönergesini php.ini veya sunucu yapılandırma dosyalarında belirterek yapabilirsiniz.

Bilginize:

register_globals yönergesine on değeri atanmışsa çerez değerleri değişkenlere de atanabilir. Bu takdirde, yukarıdaki örnekte $TestCookie değişkeni mevcut olacaktır. Ancak böyle yapmak yerine $_COOKIE kullanılmasını öneriyoruz.

Bilinen Güçlükler:

  • Çerezler sonraki sayfada görünür olmak üzere atanırlar, dolayısıyla sonraki sayfa yüklenene kadar görünür olmazlar. Bir çerezin başarıyla tanımlanıp tanımlanmadığını anlayabilmek için çerez zaman aşımına uğramadan sonraki sayfa üzerinde çerezi denemelisiniz. Zaman aşımı süresini zaman_aşımı değiştirgesi ile belirtebilirsiniz. Bir çerezin varlığını sınamanın en kolay yolu print_r($_COOKIE); çağrısı yapmaktır.
  • Çerezler atandıkları sırada kullanılan değiştirgeler kullanılarak silinmelidir. değer değiştirgesinde bir boş dizge veya FALSE belirtir ve tüm diğer değiştirgelerin çerezi atarken kullandığınız değiştirgelerle aynı olmasını sağlarsanız, ismini belirttiğiniz çerez uzak istemciden silinir. Bu işlem dahili olarak çereze 'deleted' değeri atanarak ve zaman aşımı tarihi bir yıl önceye çekilerek gerçekleştirilir.
  • Bir çereze silmek amacıyla FALSE değeri atarken mantıksal değerler kullanmamalısınız. FALSE için 0, TRUE için 1 kullanın.
  • Çerez isimleri dizi isimleri olabilir. Böylece siz PHP betiğinizde bu çerezler için dizi kullanırken, kullanıcının sisteminde bunlar ayrı ayrı çerezler olarak saklanırlar. Tek bir çereze çok sayıda isim ve değer atamak için explode() işlevini kullanabilirsiniz. Güvenlik zafiyeti oluşturması nedeniyle bu işlem için serialize() işlevinin kullanılmasını önermiyoruz.

Peşpeşe pek çok setcookie() çağrısı yapılabilir.

Ayrıca Bakınız