Помощ - Търсене - Потребители - Събития
Пълна версия: Cookies
GGbit.info > Hi-Tech > Web разработка > Полезни статии
miro
Cookies

Невъзможно е да си представим добър и полезен сайт, който не използва "бисквитки" напоследък. Въпреки опитите на някои политически организаци да ограничат използването им в Европа, очевидно е, че ако това, стане световната мрежа би загубила поне половината от потенциала си, а защо не и много повече. Факт е, че положителните страни от използването на cookie файловете са много повече от лошите. При това същите щети могат да се нанесат лесно и чрез други технологии. Затова мога да ви посъветвам да използвате "бисквитки" винаги, когато смятате, че ще имате полза от тях, без да се притеснявате от странични аргументи.
Има две много важни неща, които трябва да знаете, преди да започнете да включвате cookie в сайтовете си. Първото е, че достъп до информацията във всеки такъва файл има само собствения ви домейн. Това, което вие запишете на машината на посетителя не може да бъде прочетено от други, съответно и вие не можете да прочетете записаното от други. Но тук идва и едно предупреждение. Бисквитките са прости текстови файлове, които се предават по Интернет и ако не използвате подсигурена връзка са също толкова незащитени от зложелателна намеса, колкото и цялата информация по мрежата. Затова никога не слагайте в тях пароли, адреси, номера на кредитни карти или друга подобна информация, освен ако тя не е по някакъв начин кодирана. Най-добрата тактика е да записвате някакъв идентификатор, по който можете да разпознавате посетителя, а информацията му да държите в някаква собствена база данни.
Още трябва да знаете, че големината на един такъв файл не може да е повече от 4k. Не можете да запишете на твърдия диск повече от 20 "бисквитки" от един домейн. От своя страна браузърът не може да поддържа повече от 300 файла от всички посещавани сайтове общо. Последното е важно, защото би могло да причини изтриване на вашия файл преди указаната в него дата.
Твърди се, че някои потребители забраняват приемането на cookie чрез съответните опции на браузъра си. Казвам твърди се, защото това звучи невероятно и едва ли някога ще срещнете такъв посетител. Технологията е толкова масово разпостранена в Интернет и без нейна помощ огромно количество услуги няма да действат, така че вероятността такива потребители наистина да съществуват е доста малка. Можете да направите малък експеримент и да инструктирате браузъра си да иска потвърждение за всяко cookie, което приема. Най-вероятно няам да издържите още след първите два часа.
Сега няма да се впускаме в история и теория на cookie файловете, а ще демоснтрираме начина, по който можете да ги използвате в своите PHP скриптове. За повече информация можете да прочетете официалната спецификация на Netscape, която се намира на адрес http://www.netscape.com/newsref/std/cookie_spec.html.

За или против ползването на cookies

"Бисквитките" са малки текстови файлове, които уеб сайтовете записват на твърдите дискове на посетителите си. За разлика от рапозстранените напоследък предразсъдъци, те не са програми, а просто парчета текст. Много се изговори за потенциалната опасност от тях и за начина, по който те застрашавали правото на неприкосновеност на потребителя и неговата лична информация. Всъщност cookie файловете са необходим елемент в дейността на всеки полезен сайт и свързването им само с рекламни или следящи технологии е едностранчиво.
В тези файлове обикновено сайтовете записват важна за обслужването на посетителя информация. Без тях, например, би било невъзможно да се извърши идентификацията на потребителя за множество уеб базирани услуги. Представете си, че се налага постоянно да въвеждате името и паролата си при всяко отваряне на ново писмо, когато проверявате електронната си поща. Това би било безкрайно отегчително, бавно и неефективно. Затова когато се идентифицирате веднъж, уеб интерфейсът на e-mail услугата ще запише на cookie на твърдия ви диск информация, по която ще ви разпознава от тук нататък.
Важно е да се знае, че браузърът изпраща "бисквитката" само на този адрес от който я е получил. Така че няма начин друг сайт да прочете информация, която не е поставена от него, като по този начин открадне важна лична информация (като парола, например).
Идентификацията съвсем не е единственото приложение на cookie файловете. С тяхна помощ сайтът би могъл да ви позволи да променяте външния му вид или да изберете информацията, която да ви предлага. Използването им е особено важно в областта на онлайн търовията и рекламата. И до сега тази технология остава най-доброто решение за идентификация и персонализация на съдържаниео и услугите в Интернет.

Как да използваме cookie?

Има шест неща, които трябва да укажете при работа с една "бисквитка". Това са нейното име, съдържание, продължителност на живота, домейн, път и подсигуреност.
Името на cookie е този низ, с който по-късно ще се обръщате към нея за да получите стойността й. Продължителността на живота указва колко време желаете "бисквитката" да е валидна. Ако не сте задали време или сте го указали като 0, то файлът ще бъде изтирт от браузъра веднага след неговото затваряне. Такива cookie файлове са валидни само за текущото посечение на потребителя. Може би най-рядко ще се налага да задавате домейн за който да е валиден файла. Така или иначе не може да напишете yahoo.com и да чакате да получите файловтете, записани на твърдия диск на посетителя от портала. Браузърът така или иначе ще ви изпрати само вашите. Полза от тази възможност за настройка на cookie може да имате, ако използвате няколко субдомейна на един и същ домейн. По принцип ако "бисквитката" е зададена от уеб страница, намираща се на адрес http://domain.com, то тя ще се изпраща само до другите страници в този домейн, но не и до http://www.domain.com или другите негови поддомейни как да
преодолеем това ограничение ще разберем след малко. Пътят на валидност на cookie файла дава възможност да ограничите или разширите страниците, до които той ще се предава в рамките на текущия домейн. Това е полезно, ако имате няколко различни сайта като поддиректории на домейна. Сега ще обясня това с практически примери.
За разлика от други програмни езици, PHP предлага изключително лесен начин за записване, променяне и изтриване на "бисквитки". Тук това става става само с един ред код, съдържащ функцията setcookie(). Синтаксисът е следният:

CODE

число setcookie (низ име [, низ стойност [, число продължителност [, низ път [, низ домейн [, число подсигурена]]]]])

Функцията ще върне 1, ако се е изпълнила успешно и 0 - ако не е успяла.
Запомнете, че "бисквитките" се получават и изпращат в HTPP хедърите - тоест преди каквото и да било същинско съдържание на Уеб страницата. Това е най-често срещаната причина за появата на грешки при работа с тях. Ако искате да изпратите, промените или изтриете cookie това трябва да стане преди да изпратите на браузъра каквото и да било друго. Например :

CODE

<?
echo "<html><head>";
setcookie ("user", "ivan");
?>

Този код ще върне грешка, зашото се опитвате да изпратите "бисквитка" след като вече сте пуснали някакво съдържание. HTTP хедърите нямат нищо общо с хедърите на HTML сттраниците, ограниавани между таговете <head> и </head>. Цялото съдържание на уеб страницата влиза в тялото на HTTP пакета.
Когато се опитате да изпълните този код, PHP ще ви съобщи, че хедърите вече са изпратени, като ще ви каже на кой ред в скрипта е завършило изпращането и на кой ред вие се опитвате да пуснете cookie. Това е наистина полезно, но бих искал да обърна внимание на един случай, когато е много трудно да откриете от къде идва грешката.

CODE

<?
setcookie ("user", "ivan");
echo "<html><head>";
?>

На пръв поглед проблемът би трябвало да е решен и горния код трябва да се изпълни правилно. Но поради една или друга причина в него има интервал пред отварящата скоба на PHP. Този интервал сам по себе си е изход, така че слага край на заглавните части. Затова бъдете сигурни, че "<?" е жинаги в самото начало на файла. Макар и на пръв поглед дребен, този пробелм може да прични няколко часа търсене на причната си, особено ако има някоко включени един в друг файлове, затова е добре да го имате предвид.
Както забелязахте от начина на представяне на синтаксиса на функцията setcookie(), единствения задължителен елемент в нея е името й. Това обаче не означава, че можете да прескачате аргументите както искате. Това е друга често срещана грешка, която води до грешно записани "бисквитки" или до невъзможността да се изтрие вече съществуваща. Ако желаете да използвате опцията път на действие, но не желаете да указвате продължителност, нямате право да напишете

CODE

setcookie ("user", "ivan", "/mojat_sajt");

Функцията си търси елементите по реда, който те бяха показани по-горе и когато ползвате някой от тях, другите в ляво от него стават задължителни. Така че вярният вариант на горния ред е:

CODE

setcookie ("user", "ivan", 0, "/mojat_sajt");

Можете да "прескочите" елеметите, които не искате да задавате с 0 - когато трябва да са числа или с "" - когато трябва да са низове. Ето как ще изглежда една "бисквитка", която искаме да използваме по подигурена връзка (HTTPS), но всички останали аргументи са по поразбиране:

CODE

setcookie ("user", "ivan", 0, "", "", 1);

Така записахме "бисквитка" с име "user", стойност "ivan", валидна за всички страници в текущата поддиректория на текущия домейн при използването на подсигурена връзка.
Изтриването на cookie става, като на съществуващ файл се зададе празно съдържание. Но това трябва да стане по същия начин, по който е бил създаден. Така за да изтирем току що създаденото cookie, трябва да напишем:

CODE

setcookie ("user", "", 0, "", "", 1);

Нека сега илюстрирам всичко това с пример. Ще създадем малка система за проследяване на посетителя на адрес http://www.domain.com/site
В началния файл, примерно index.php, включваме форма, в която очакваме да получим името/прякора на потребителя:

CODE


<form action=user.php method=post>
<input type="text" name="username">
<input type="submit" value="изпрати">
</form>

Когато потребителят въведе името си и кликне бутона за изпращане, той ше попадне на файла user.php, в който е записано:

CODE

<?
setcookie ("user", $username);
?>

По този начин всички страници, намиращи се на http://www.domain.com/site ще имат достъп до съдържанието на cookie файла user - тоест до името, посочено от посетителя. Важно е да запомните, че това не може да стане в момента на изпращането. С други думи - user.php няма достъп до "бисквитката" в момента. Тя ще достъпна при следващото зареждане на страница. В конкретния случай това не е проблем, защото ние все пак разполагаме с името на потребителя в променливата, използвана във формата от index.php. Така че можем да напишем :

CODE

<?
setcookie ("user", $username);
echo "Здравейте, $username!<br>Кликнете <a href="index.php">тук</a>, за да смените името, което посочихте или <a href="content.php">тук</a> за да продължите!"
?>

За да променим съдържанието на cookie в PHP е необходимо просто да изпратим ново със същото име и същите други атрибути, ако сме посочили такива, но с различно съдържание. Затова ако посетителят иска да смени въведеното от него име, го изпратихме отново в index.php, където ще може да повтори процедурата.
В PHP прочитането на cookie е безкрайно упростено. Тя е винаги достъпна за използване, без да е необходимо да пишете какъвто и да било предварителен код. При зареждането на PHP скрипта се създават автоматично променливи за всички "бисквитки", които сървърът получи. Името на променливата взема името на съответното cookie, а в стойността й ще открием съдържанието му. И ако основното съдържание на сайта се намира във файл content.php, в него можем да запишем :

CODE

<?
echo "Потребител: $user";
........
?>

След това, знаейки името, можем да направим проверка в база данни за някакви настройки, записани по-рано от посетителя или да извършим други действия с информацията в $user.Нека сега добавим още един аргумент за "бисквитката" си, например да укажем, че тя ще е валидна в следващия един час. За целта можем да използваме вградената в PHP функция time(), от която ще вземем текущото време, след което ще прибавим 3 600 секунди:

CODE

setcookie ("user", $username, time() + 3600);

При това положение, за да изтрием "бисквитката" можем да напишем:

CODE

setcookie ("user", "", time() - 3600);

Нека сега разширим обхвата на дейност, например до Уеб страници, намиращи се в рамките на която и да е директория на www.mydomain.com/ Тъй като cookie файла бе записан от директория "site" в рамките на домейна, при досегашния начин на боравене с нея тя ще е достъпна само до PHP скриптовете в тази поддиректория. Но може да се наложи да го ползваме например в http://www.domain.com/more. За целта трябва да укажем, че съответното cookie е валидно за всички поддиректории на главната директория на домейна, която се обозначава с наклонена черта - "/". Тогава записът би изглеждал така:

CODE

setcookie ("user", $username, time() + 3600, "/");

По този начин във всеки PHP скрипт, намиращ се в която и да е поддиректория на http://www.domain.com ще можем да прочетем стойността на променливата $user, която ще ни дава въведеното потребителско име. Но какво ще стане ако посетителят отиде на http://domain.com/site/content.php? За момента бисквитката ни е валидна само за www субдомейна, но не и за останалите. За да решим проблема трябва да използваме атрибута domain и да я изпратим така:

CODE

setcookie ("user", $username, time() + 3600, "/", ".domain.com");

Обърнете внимание на точката преди името на домейна. По този начин указваме, че желаем да получаваме "user" в който и да е негов субдомейн. За да изтрием това cookie трябва да напишем :

CODE


setcookie ("user", "", time() - 3600, "/", ".domain.com");
Relevant Advertise!
Това е "lo-fi" версия на нашия форум. За да видите пълната версия, моля натиснете тук.
Invision Power Board © 2001-2018 Invision Power Services, Inc.